java.io.FileNotFoundException:stack.txt:打开失败:EROFS只读文件系统

问题描述

编辑:在跟进这两个建议时,我确定以下内容适用于将字符串作为字节数组写入文件。但现在我需要弄清楚如何将字节数组读回字符串。我可以使用帮助... 是否有一个 FileInputStream 组件与这个 FileOutputStream 反向等效?这适用于将字符串写入为字节数组。

try {
    FileOutputStream fos = openFileOutput("stack.txt",Context.MODE_PRIVATE);
    for (String item : stack)
       fos.write(stack.pop().getBytes());
    fos.close();
    sb.append("The Stack is saved.\n");
    } catch (IOException e) {
         sb.append(e.toString());
    }
displayText(sb.toString());

我正在尝试将 arraydeque 中的字符串写入文件。我使用 arraydeque 作为堆栈。字符串的长度不一。打开文件进行输出时出现此错误...

java.io.FileNotFoundException: stack.txt: open Failed: EROFS (Read-only file system)

我想我已经看过所有关于这个主题的帖子,但没有任何帮助。 我的两个代码片段是:

  1. 在 onCreate()...
root = new File(getExternalFilesDir(null),"/HTMLSpyII/");
if (!root.exists()) {
    if (!root.mkdirs()) {
        runTimeAlert("File path does not exist or\n" +
            "Unable to create path \n" + root.toString());
            }
        }
  1. 在程序中...
try {
    DataOutputStream dos = new DataOutputStream(
        new FileOutputStream("stack.txt")); // program fails here
    for (String item : stack)
        dos.writeUTF(stack.pop());
        dos.close();
        sb.append("The Stack is saved.\n");
    } catch (IOException e) {
        sb.append(e.toString());
    }
    displayText(sb.toString());

我有使用 DataInputStream 和 FileInputStream 读回它们的并行代码。我错过了一些东西。可能是在创建文件之前进行了一些初步准备?

在做一些研究时,我感觉问题可能是我还不熟悉使用新的特定于应用程序的持久性内部/外部存储的要求?但我不知道所以我正在寻找一些指导,请:)

解决方法

这是问题的完整解决方案的概要。希望这有助于某人,有时...

  1. 问题是: 使用ArrayDeque作为栈保存字符串,使用文件保存和恢复栈。

  2. 解决方案的关键部分是: 使用 ObjectOutputStream 和 ObjectInputStream 将堆栈保存和恢复到外部存储。 使用 getExternalFilesDir() 打开文件以进行保存和恢复。

  3. 打开文件以保存当前堆栈内容...

File stackRoot = new File(getExternalFilesDir(null),"/AppName/stack.dat");
    FileOutputStream fos = new FileOutputStream(stackRoot);
    ObjectOutputStream oos = new ObjectOutputStream(fos);
  1. 要将堆栈清空到文件中...
for (String item : stack) oos.writeObject(item);
oos.close();
  1. 要打开文件以恢复保存的堆栈内容...
File stackRoot = new File(getExternalFilesDir(null),"/AppName/stack.dat");
    FileInputStream fis = new FileInputStream(stackRoot);
    ObjectInputStream ois = new ObjectInputStream(fis);
  1. 要将文件清空到堆栈中...
while (true) stack.addLast((String) ois.readObject());