【问题标题】:Android file system: java.io.FileNotFoundException: /savedArticlesFile: open failed: EROFS (Read-only file system)Android文件系统:java.io.FileNotFoundException:/savedArticlesFile:打开失败:EROFS(只读文件系统)
【发布时间】:2015-01-02 03:41:35
【问题描述】:

即使在阅读了我可以找到的每个 Stack Overflow 问题并尝试了几种不同的创建文件的方法之后,我仍然不断收到上述错误消息。我目前有以下两种方法来读取和写入一组对象到内部存储:

public HashSet<PrestoItem> readSavedArticleFile() {
    Log.d("snw", "readSavedArticlesFile()");
    String filename = "savedArticlesFile";
    String filePath = getActivity().getFilesDir().getPath().toString() + "/" + filename;
    File savedArticlesFile = new File(filePath);
    ObjectInputStream input;
    HashSet<PrestoItem> articleSet = null;

    // retrieve article set
    try {
        input = new ObjectInputStream(new FileInputStream(savedArticlesFile));
        articleSet = (HashSet<PrestoItem>) input.readObject();
        input.close();
    } catch (StreamCorruptedException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    if (articleSet == null) {
        articleSet = new HashSet<PrestoItem>();
    }

    return articleSet;
}

public void saveArticleSet(HashSet<PrestoItem> articleSet) {
    // write set back to file
    String filename = "savedArticlesFile";
    String filePath = getActivity().getFilesDir().getPath().toString() + "/" + filename;
    ObjectOutput output;
    try {
        output = new ObjectOutputStream(new FileOutputStream(filePath));
        output.writeObject(articleSet);
        output.close();
    }
    catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}

每当我遇到 try 块,即尝试打开输入或输出流时,我都会收到 ROFS 错误。我的印象是我提供的路径应该同时启用 r/w 权限,但即使在读取时也会引发错误。我显然在某个地方误解了一些东西。任何指导将不胜感激。

编辑:堆栈跟踪

11-05 15:40:09.659  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ java.io.FileNotFoundException: /data/data/com.gannett.dolly.CooksCorner/files/savedArticlesFile: open failed: ENOENT (No such file or directory)
11-05 15:40:09.659  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:409)
11-05 15:40:09.659  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ at java.io.FileInputStream.<init>(FileInputStream.java:78)
11-05 15:40:09.669  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ at com.gannett.dolly_android.WebAppLoaderFragment.readSavedArticleFile(WebAppLoaderFragment.java:378)
11-05 15:40:09.669  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ at com.gannett.dolly_android.WebAppLoaderFragment$2.shouldOverrideUrlLoading(WebAppLoaderFragment.java:225)
11-05 15:40:09.669  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ at com.android.webview.chromium.WebViewContentsClientAdapter.shouldOverrideUrlLoading(WebViewContentsClientAdapter.java:293)
11-05 15:40:09.669  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ at com.android.org.chromium.android_webview.AwContentsClientBridge.shouldOverrideUrlLoading(AwContentsClientBridge.java:96)
11-05 15:40:09.669  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
11-05 15:40:09.669  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)
11-05 15:40:09.669  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:102)
11-05 15:40:09.669  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ at android.os.Looper.loop(Looper.java:146)
11-05 15:40:09.669  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5487)
11-05 15:40:09.669  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
11-05 15:40:09.669  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515)
11-05 15:40:09.669  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
11-05 15:40:09.669  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
11-05 15:40:09.669  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
11-05 15:40:09.669  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
11-05 15:40:09.669  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ at libcore.io.Posix.open(Native Method)
11-05 15:40:09.669  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
11-05 15:40:09.669  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:393)
11-05 15:40:09.669  26726-26726/com.gannett.dolly.CooksCorner W/System.err﹕ ... 15 more

【问题讨论】:

  • 根据错误消息,它看起来像 someplace else 您可能正在尝试在没有路径前缀的情况下单独使用文件名。请将错误的实际堆栈跟踪编辑到您的问题中,如果引用的代码不是您已经发布的,请包含它。还要清理、重建和部署您的项目,以确保您正在运行的版本与您的最新源代码匹配。
  • 试试 getActivity().getFilesDir().getAbsolutePath() + "/" + 你的文件名。我认为名为“文件”的目录尚不存在。如果需要,使用 file.exists() 检查并使用 mkdirs() 创建。
  • @ChrisStratton 请查看我编辑的问题,我已粘贴在堆栈跟踪中
  • @greenapps 您可能正在做一些事情,我想如果该文件不存在,Android 会自动创建它。您能否详细介绍一下使用 mkdirs() 创建文件的代码?
  • @greenapps 我认为该目录也应该存在,因为我直接向系统询问它。创建目录的代码是什么样的?类似 if (!savedArticleFile.exists()) { savedArticleFile.mkdirs(); } 还是那样?

标签: java android io filenotfoundexception


【解决方案1】:

尝试使用directory.mkdirs() 而不是directory.mkdir()

【讨论】:

    猜你喜欢
    • 2015-01-22
    • 2014-04-19
    • 2019-09-30
    • 2012-12-08
    • 2014-06-01
    • 1970-01-01
    • 2016-01-23
    • 2015-06-08
    • 1970-01-01
    相关资源
    最近更新 更多