0

我一直在用java编写一个待办事项列表应用程序,每个待办事项都存储为类ToDo(我创建的)的一个对象。
ToDo 类是可序列化的,我正在使用 ObjectOutputStream 将对象写入文本文件。这样做后我关闭了 ObjectOutputStream。
我可能应该提到,目前我的文本文件是空的,因为其中没有待办事项,并且 GUI.items 是我的 GUI 类中的静态 ArrayList。

当我运行读取文件的方法时,会在行上抛出一个 IO 异常:

ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);

这是读取文件的方法:

public void read() {
    try (FileInputStream fileInputStream = new FileInputStream("todo.txt")) {

        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);

        GUI.items.clear();

        while (objectInputStream.readObject() != null) {
            GUI.items.add((ToDo) objectInputStream.readObject());
        }

        GUI.updateInterface();

        objectInputStream.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
        //JOptionPane.showMessageDialog(null, "Error: To-Do List not found.\nPlease contact the developer.", "Error", JOptionPane.ERROR_MESSAGE);
    } catch (IOException e) {
        JOptionPane.showMessageDialog(null, "Error: To-Do List could not be opened.\nPlease contact the developer.", "Error", JOptionPane.ERROR_MESSAGE);
    } catch (ClassNotFoundException e) {
        JOptionPane.showMessageDialog(null, "Error: To-Do List object type could not be found.\nPlease contact the developer.", "Error", JOptionPane.ERROR_MESSAGE);
    }
}

为什么会引发此异常,我该如何解决?谢谢。

4

2 回答 2

3

是的,这是有记录的:

创建一个从指定 InputStream 读取的 ObjectInputStream。从流中读取序列化流标头并进行验证。

...

抛出:
IOException - 如果在读取流标头时发生 I/O 错误

如果您的文件为空,则它不包含流标头。使用ObjectOutputStream写入 0 个对象后关闭的文件创建的文件与空文件不同。

于 2013-10-27T20:49:22.967 回答
2

我发现这是使用 Eclipse 逐行调试器的行。

堆栈跟踪也会向您显示该行。

初始化 ObjectInputStream 会导致 EOFException

OIS 有一个奇怪的习惯,即当文件格式实际上无效(或者您没有按预期读取它)时抛出 EOF 鉴于文件名是todo.txt我怀疑它是文本文件,不能作为对象流读取。

另一种可能性是您比这更进一步,并且当您检查每个第二个对象时,您的循环正在中断null。这有点像逐行读取文本文件,但对于 BufferedReader 是错误的,对于 ObjectInputStream 是完全错误的。

如果要将 List 序列化为对象流,我建议您编写和读取 List,而不是一次读取一个元素,不知道何时完成。

于 2013-10-27T20:52:02.067 回答