ObjectInputStream.readObject导致EOFException

时间:2012-11-02 15:02:34

标签: java io

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

  

java.io.EOFException at   java.io.ObjectInputStream中的$ BlockDataInputStream.peekByte(ObjectInputStream.java:2571)       at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1315)       at 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);

2 个答案:

答案 0 :(得分:1)

该文件是否以原子方式创建?或者您是否可能在创建文件时读取文件?

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

或者,您的编写过程可以编写文件,然后编写相应的标记文件,表明它已完成编写序列化对象(例如objectfile.serobjectfile.ser.done

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

答案 1 :(得分:0)

可以由两个考虑因素引起

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