【问题标题】:ObjectInputStream.readObject causing EOFExceptionObjectInputStream.readObject 导致 EOFException
【发布时间】:2012-11-02 23:19:05
【问题描述】:

我正在编写一个简单的客户端-服务器应用程序,其中服务器会打开一个线程,该线程会监视目录中的文件创建。这些文件是序列化的对象。线程应该反序列化它们,读取数据并创建一个新对象以将其发送给客户端。 所以总的来说它工作得很好,但有时我会得到:

java.io.EOFException 在 java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2571) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1315) 在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) 在 ServerSend.start(ServerSend.java:58) 在 ServerSend.run(ServerSend.java:25) 在 java.lang.Thread.run(Thread.java:722)

但是为什么会这样呢?为什么只是有时... 我读取对象的程序的一部分:

FileInputStream fileStream = new FileInputStream(dirpath+"/"+t);
ObjectInputStream ois = new ObjectInputStream(fileStream);
Object toSend = ois.readObject();

Source code on pastebin

其他一些程序创建这些对象,我的 StreamReader 想要读取:

FileOutputStream fileStream = new FileOutputStream(filepath_to_where_listening);
            ObjectOutputStream oos = new ObjectOutputStream(fileStream);
            oos.writeObject(mmout);

【问题讨论】:

    标签: java io


    【解决方案1】:

    该文件是原子创建的吗?或者您是否有可能在创建文件时正在读取它?

    您可以创建带有.tmp 扩展名的文件(例如),然后在文件完成后删除扩展名。这取决于使用的文件系统,但我希望这对于大多数(全部?)Unix/Linux 文件系统来说是原子的。

    或者你的写入过程可以写入文件,然后写入相应的标志文件,这表明它已经完成了序列化对象的写入(例如objectfile.serobjectfile.ser.done

    另一种解决方案(非常不确定)是监视文件,然后在读取文件之前等待指定的时间,以使其完成创建。

    【讨论】:

    • 我同意,他很有可能在文件“最终确定”之前访问该文件
    • 嗯,是的,还有另一个程序可以创建和序列化对象。使用 FileOutputStream 完成。
    【解决方案2】:

    这可能是由两种情况引起的

    • 文件未正确关闭,导致文件末尾被截断。如果文件被丢弃,GC 可以为您关闭文件,但这种行为是不可靠的。
    • ObjectOutputStream writeXxxx 而 ObjectInputStream readYyyy,其中 Xxxx 不是 Yyyy。例如writeObject 和 readInt 会导致这个错误。

    【讨论】:

    • 我能做些什么来防止这些错误?一些程序自动写入对象---
    • 收到 EOFException 后,您将无法继续读取数据。您可以捕获异常并继续您已读取的数据。
    • 简单的解决方案是在您完成后始终正确关闭您的流,这样您就不会遇到这个问题。在完成写入之前不要读取文件。文件不是消息传递的良好替代品。
    • 感谢您的解释。问题是线程是自动大量创建的,这非常有帮助。他们必须相互通信,所以每个线程都有自己的目录,它正在侦听:D
    • 等待文件完成的一种简单方法是。 a) 检查修改日期和/或 b) 如果读取失败,则在延迟后重新读取文件。
    猜你喜欢
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    相关资源
    最近更新 更多