0

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

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

pastebin 上的源代码

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

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

2 回答 2

1

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

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

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

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

于 2012-11-02T15:07:16.623 回答
1

可能由两种情况引起

  • 文件未正确关闭,导致文件末尾被截断。如果文件被丢弃,GC 可以为你关闭文件,但这种行为是不可靠的。
  • ObjectOutputStream writeXxxx 而 ObjectInputStream readYyyy 其中 Xxxx 不是 Yyyy。例如 writeObject 和 readInt 将导致此错误。
于 2012-11-02T15:07:53.793 回答