得到一个奇怪的filenotfoundexception

时间:2018-01-04 19:19:37

标签: java android android-file

我目前处于初学者级别,涉及到Android&我目前正在审视我目前面临的一个问题。

我正在创建一个Android应用来检查" cache.json"存在于内部存储中:

  • 如果它不存在则先创建它&将从HTTP API获取的字符串写入该文件(在下面的代码中替换为固定字符串)。
  • 无论如何,写完后(如有必要)阅读文件&做适当的事情。

这是代码段:

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()&amp; readFile()都被调用。当我打开流时,我在readFile()中得到一个FileNotFoundException,即使应该创建该文件,因为在readFile()之前调用了writeFile()。

如果我在一次执行中写文件&amp;然后在另一个上调用readFile(),它只是按原样运行。

这是我所面临的错误。

  

System.err:java.io.FileNotFoundException:/data/user/0/host.timetable.timetablenotifier/files/cache.json(没有这样的文件或目录)   System.err:at java.io.FileInputStream.open(Native Method)

任何帮助都会非常感激。

由于

2 个答案:

答案 0 :(得分:1)

AsyncTask在后​​台线程中运行,因此主线程中的其他代码不会等待执行完成。简而言之,readFile()方法在writeFile()完成之前执行,因此有FileNotFoundException。如果您将readFile()方法放在onPostExecute()

Asynctask方法的末尾,那么对您有用的是什么?

答案 1 :(得分:1)

writeFile()是异步的。当该方法返回时,对此文件没有任何影响。最多可能会调用onPreExecute()的{​​{1}}。因此,当您致电JsonTask时,该文件尚不存在。

除此之外:

  • 您在readFile()中使用了AsyncTask,但在writeFile()中执行了磁盘I / O,并且在主应用程序线程上调用了该方法。

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

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

  • 出于性能原因,一次只读一个数据readFile()并不是推荐接近20年的方法。

  • 您将遇到与配置更改相关的多个问题,例如屏幕轮换,因为您的intAsyncTask帐户的配置都没有更改

此外:

  • ProgressDialog可由getApplicationContext().getFilesDir()

  • 中的getFilesDir()取代
  • 您不需要onCreate()