gpt4 book ai didi

java - 出现奇怪的 filenotfound 异常

转载 作者:行者123 更新时间:2023-12-02 02:23:38 26 4
gpt4 key购买 nike

就 Android 而言,我目前处于初学者水平,而且我目前正在为当前面临的问题摸不着头脑。

我正在创建一个 Android 应用程序来检查内部存储中是否存在“cache.json”:

  • 如果不存在,则首先创建它并将从 HTTP API 获取的字符串写入文件(用下面代码中的固定字符串替换)。
  • 无论如何,请在写入完成后读取文件(如有必要)并执行适当的操作。

这是代码 fragment :

public class ShowClasses extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
filename = "cache.json";
file = new File(getApplicationContext().getFilesDir(), filename);

if (file.exists()) {
System.out.println("EXISTS");
} else {
System.out.println("DOES NOT EXIST");
writeFile();
}

readFile();
}

public void writeFile() {
new JsonTask().execute(email);
}

public void readFile() {
FileInputStream fin = null;
try {
fin = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}

int c;
result = "";
try {
while( (c = fin.read()) != -1){
result = result + Character.toString((char)c);
}
} catch (IOException e) {
e.printStackTrace();
}

try {
fin.close();
} catch (IOException e) {
e.printStackTrace();
}

return;
}

private class JsonTask extends AsyncTask<String, Void, String> {

protected void onPreExecute() {
result = ""; // Clear result
super.onPreExecute();
pd.setMessage("Please wait");
pd.setCancelable(false);
pd.show();
}

protected String doInBackground(String... params) {
return "THIS STRING IS GOING TO BE RETURNED " + params[0];
}

@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);

try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}

FileOutputStream fileout = null;

try {
fileout = new FileOutputStream(file);
fileout.write(result.getBytes());
//display file saved message
msg("File saved successfully!");

} catch (Exception e) {
e.printStackTrace();
}

try {
fileout.close();
} catch (IOException e) {
e.printStackTrace();
}

if (pd.isShowing()){
pd.dismiss();
}

}
}
}

我尝试删除代码中不必要的部分,以使其长度更小。

我面临的实际问题是当 writeFile() 和 readFile() 都被调用时。当我打开流时,我在 readFile() 中收到 FileNotFoundException,即使应该创建文件,因为 writeFile() 在 readFile() 之前调用。

如果我在一次执行中 writeFile,然后在另一次执行中调用 readFile(),它就会按预期工作。

这是我面临的错误。

System.err: java.io.FileNotFoundException: /data/user/0/host.timetable.timetablenotifier/files/cache.json (No such file or directory) System.err: at java.io.FileInputStream.open(Native Method)

任何帮助将不胜感激。

谢谢

最佳答案

writeFile()是异步的。当该方法返回时,该文件没有发生任何事情。最多onPreExecute()您的JsonTask可能会被称为。所以,当您调用readFile()时,该文件还不存在。

除此之外:

  • 您有一个AsyncTask您在 writeFile() 中使用的,但是您在 onPostExecute() 中进行磁盘 I/O ,并且该方法在主应用程序线程上调用。

  • 您正在 readFile() 中的主应用程序线程上执行磁盘 I/O。 .

  • 您捕获异常,记录它们,然后继续执行代码,而大多数异常意味着后面的语句也将失败。

  • 读入数据一int出于性能原因,在近 20 年里,一次不再是推荐的方法。

  • 您将遇到与配置更改相关的多个问题,例如屏幕旋转,因为您的 AsyncTask 都没有。也不是你的ProgressDialog配置更改的帐户

另外:

  • getApplicationContext().getFilesDir()可以替换为 getFilesDir()onCreate()

  • 您不需要createNewFile()

关于java - 出现奇怪的 filenotfound 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48102107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com