初始化的ObjectInputStream导致IOException类型的EOFException

时间:2013-10-27 20:44:28

标签: java ioexception objectinputstream eofexception

我一直在用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);
    }
}

为什么会抛出此异常,我该如何解决?感谢。

2 个答案:

答案 0 :(得分:3)

是的,这表现为documented

  

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

     

...

     

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

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

答案 1 :(得分:2)

  

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

堆栈跟踪也会显示该行。

  

初始化的ObjectInputStream会导致EOFException

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

另一种可能性是你比这更进一步,当你检查每一个第二个对象是null时,你的循环就会破裂。这有点像逐行读取文本文件但BufferedReader错误,而ObjectInputStream完全错误。

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