![](/img/trans.png)
[英]File.createnewFile() always returns false even if the file is newly created
[英]File created but returns false
我不明白為什么我們不輸入第二個if。 我首先檢查文件是否存在(否,邏輯),創建它,然后再次檢查,但它仍返回false。 我試了一個小時才發現問題,並且確定這是一個愚蠢的錯誤。 對不起,我英語不好
這是代碼:
package com.example.testcreatefileonclick;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Main extends Activity implements android.view.View.OnClickListener{
Button button;
Button addTeam;
Boolean append = true;
String name = "nomFichier.txt";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button)findViewById(R.id.button1);
button.setOnClickListener((OnClickListener) this);
addTeam = (Button)findViewById(R.id.button2);
addTeam.setOnClickListener((OnClickListener) this);
}
@Override
public void onClick(View v) {
try {
File fichier = new File(name);
if (!fichier.exists()) {
System.out.println("File doesn't exists");
}
FileOutputStream fOut = openFileOutput(name, MODE_WORLD_READABLE);
OutputStreamWriter osw = new OutputStreamWriter(fOut);
osw.write("text");
osw.flush();
osw.close();
//Why don't we go in this if ?
if (fichier.exists()) {
System.out.println("File exists");
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
編輯:工作代碼
package com.example.testcreatefileonclick;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Main extends Activity implements android.view.View.OnClickListener{
Button button;
Button addTeam;
Boolean append = true;
String name = "nomFichier.txt";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button)findViewById(R.id.button1);
button.setOnClickListener((OnClickListener) this);
addTeam = (Button)findViewById(R.id.button2);
addTeam.setOnClickListener((OnClickListener) this);
}
@Override
public void onClick(View v) {
try {
String filePath = (this.getFilesDir().getPath().toString());
File fichier = new File(filePath + name);
if (!fichier.exists()) {
System.out.println("File doesn't exists");
}
fichier.createNewFile();
FileWriter file = new FileWriter(filePath + name);
file.write("text");
file.flush();
file.close();
if (fichier.exists()) {
System.out.println("File exists");
}
} catch (IOException e) {
System.out.println("Exception");
e.printStackTrace();
}
}
}
// Why don't we go in this if ?
最可能的原因(IMO)是openFileOutput(name, MODE_WORLD_READABLE)
引發異常。
如果發生這種情況,由於這段令人震驚的代碼,您將一無所知。
} catch (Exception e) {
// TODO: handle exception
}
為什么令人震驚?
Exception
而不是您希望引發的特定異常(例如IOException
)。 這些事情中的每一個都是不好的做法 。 一起做是很不錯的……您值得在此上浪費一個小時!
如果我對擠壓異常的診斷不正確,那么還有另一種可能性。 openFileOutput
的文檔說:
“打開與此Context的應用程序包關聯的私有文件進行寫入。” 。
目前尚不清楚該文件的打開/創建位置,但似乎與File.exists
所處的位置不同。 您會注意到openFileOutput
不會將File
對象作為其輸出。
最后,還有一個更細微的問題,在這種情況下不會傷害您,但在其他情況下可能會傷害您。 你寫了 ...
if (!fichier.exists()) {
System.out.println("File doesn't exists");
}
FileOutputStream fOut = openFileOutput(name, MODE_WORLD_READABLE);
問題是存在競爭條件。 在通話之間exists
並呼吁openFileOutput
,有一個小的時間窗口,在其中一些其他的應用程序可以飛躍和創建文件。 因此,當您隨后調用openFileOutput
,它可能會發現文件已創建。
顯然,在這種情況下,它沒有區別。 但是在其他情況下可能會。 教訓是,調用File.exists()
, File.canWrite
等來“保護”以下創建/打開文件的嘗試是不可靠的。
嘗試替換這個:
FileOutputStream fOut = openFileOutput(name, MODE_WORLD_READABLE);
OutputStreamWriter osw = new OutputStreamWriter(fOut);
osw.write("text");
osw.flush();
osw.close();
這樣 :
fichier.createNewFile();
FileWriter file = new FileWriter(name);
file.write("text");
file.flush();
file.close();
如果不是下面的異常問題,則可能是由於您第一次調用exist方法而緩存了結果(不太可能)。 您可以在調用后嘗試創建一個新的文件對象以對此進行測試。
如果您不滿意,我將使用createNewFile方法,該方法將返回一個布爾值供您在邏輯中使用。 這比必須兩次詢問IO是否存在更好。
public boolean createNewFile() throws IOException
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.