意外的EOF异常

时间:2017-10-29 17:36:31

标签: java android

我正在尝试读取/写入自定义(可序列化)对象的ArrayList到文件。它正在按预期工作,除了一件事:我在读取文件时遇到EOFexception。这是我的代码:

class FileHandler {
    private final String FILENAME = "storage.txt";

    ArrayList<Plane> readFromFile(Context context) {
        ArrayList<Plane> returnList = new ArrayList<>();
        Plane temp;

        try {
            FileInputStream fileInputStream = context.openFileInput(FILENAME);
            ObjectInputStream objectInStream = new ObjectInputStream(fileInputStream);


            while ((temp = (Plane)objectInStream.readObject()) != null) {
                returnList.add(temp);
            }

            objectInStream.close();
        }
        catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }

        return returnList;
    }

    void writeToFile(ArrayList<Plane> inData, Context context) {
        FileOutputStream fileOutputStream;
        ObjectOutputStream outputStream;

        try {
            fileOutputStream = context.openFileOutput(FILENAME, Context.MODE_PRIVATE);
            outputStream = new ObjectOutputStream(fileOutputStream);

            for (Plane p: inData) {
                outputStream.writeObject(p);
            }

            outputStream.close();
            fileOutputStream.close();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

文件按预期写入和读取,但我在读取文件时遇到EOF异常。不知道为什么。我以为我的while循环会确保无法发生?

  1. 为什么我会收到这个例外?
  2. Plane是可序列化的。如果我将Plane更改为parcable,是否可以读取和写入文件? (如何?)

1 个答案:

答案 0 :(得分:0)

  

任何读取超出相应writeObject方法写入的自定义数据边界的对象数据的尝试都将导致使用eof字段值为true抛出OptionalDataException。超出分配数据末尾的非对象读取将以与它们指示流结束相同的方式反映数据的结束:逐字节读取将返回-1作为字节读取或读取的字节数,以及原语读取将抛出EOFExceptions。如果没有相应的writeObject方法,则默认序列化数据的结尾标记分配数据的结束。

这是我在https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html

上找到的

当没有数据时,会发生最后一次读取数据的尝试。 while循环条件并不能真正检查是否有数据要读取。无论如何,它都试图阅读它。