Файловая система Android: java.io.FileNotFoundException: /savedArticlesFile: ошибка открытия: EROFS (файловая система только для чтения)

Я продолжаю получать указанную ошибку даже после прочтения каждого вопроса о переполнении стека, который я могу найти, и попробовать несколько различных методов создания файла. В настоящее время у меня есть следующие два метода чтения и записи набора объектов во внутреннюю память:

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

person swilkeni    schedule 05.11.2014    source источник
comment
Судя по сообщению об ошибке, где-то еще вы, возможно, пытаетесь использовать имя файла без префикса пути. Пожалуйста, отредактируйте фактическую трассировку стека ошибки в своем вопросе, а затем включите ссылочный код, если это не то, что вы уже опубликовали. Также очистите, перестройте и разверните свой проект, чтобы убедиться, что версия, которую вы используете, соответствует вашему последнему исходному коду.   -  person Chris Stratton    schedule 05.11.2014
comment
Попробуйте использовать getActivity().getFilesDir().getAbsolutePath() +/+ ваше имя файла. Я думаю, что каталога с именем «файлы» еще не существует. Используйте file.exists() для проверки и создания при необходимости с помощью mkdirs().   -  person greenapps    schedule 05.11.2014
comment
@ChrisStratton Пожалуйста, посмотрите мой отредактированный вопрос, я вставил трассировку стека   -  person swilkeni    schedule 05.11.2014
comment
@greenapps Возможно, вы что-то поняли, я подумал, что если файла не существует, Android просто создал его автоматически. Не могли бы вы рассказать подробнее о коде для создания файла с помощью mkdirs()?   -  person swilkeni    schedule 05.11.2014
comment
Нет, не создавать файл, а сначала создать каталог.   -  person greenapps    schedule 05.11.2014
comment
/data/data/com.gannett.dolly.CooksCorner/files/savedArticlesFile. Итак, я сказал, что подкаталог «файлы», вероятно, еще не существует. Для начала адаптируйте свой код сохранения в файл.   -  person greenapps    schedule 05.11.2014
comment
@greenapps Я думал, что каталог тоже должен существовать, так как я напрямую запрашиваю его у системы. Как будет выглядеть код для создания каталога? Что-то вроде if (!savedArticleFile.exists()) { saveArticleFile.mkdirs(); } или это далеко?   -  person swilkeni    schedule 05.11.2014
comment
Да. Вот как это сделать. Но создавайте его только во время save() перед созданием файла. И проверьте существование во время чтения().   -  person greenapps    schedule 05.11.2014
comment
Извини. Это, конечно, НЕ saveArticleFile, который вы должны использовать для .exists() и mkdirs(), а getFilesDir(). Вы должны проверить, существует ли каталог (не файл), и сделать это, если нет. Затем, когда каталог существует, вы можете создать в нем файл.   -  person greenapps    schedule 06.11.2014
comment
Я думаю, что у вас сейчас проблемы, если вы уже пытались использовать saveArticleFile, поскольку вы создали каталог с предполагаемым именем файла. Если да, то сначала удалите его. Вы должны.   -  person greenapps    schedule 06.11.2014
comment
Нет, каталог файлов уже существует. Проблема здесь (и это другая проблема, чем исходный отчет) заключается в том, что вы пытаетесь открыть файл, который вы еще не создали. Создание объекта File не создает файл на диске; но создание FileOutputStream делает. Скорее всего, вы просто пытаетесь читать до того, как написали.   -  person Chris Stratton    schedule 06.11.2014
comment
Но Крис, я не вижу ничего плохого в его saveArticleSet(). (Ну, за исключением отсутствующего каталога).   -  person greenapps    schedule 06.11.2014
comment
Вы оба были правы, я реализовал то, что вы оба говорили, и теперь это работает правильно. Большое спасибо за то, что направили меня на правильный путь!   -  person swilkeni    schedule 06.11.2014


Ответы (1)


Попробуйте использовать directory.mkdirs() вместо directory.mkdir()

person Ratan Maniyar    schedule 23.04.2015