我正在编写一个简单的客户端 - 服务器应用程序,其中服务器打开一个线程,该线程监视目录以进行文件创建。这些文件是序列化对象。线程应该反序列化它们,读取数据并创建一个新对象以将其发送到客户端。 所以总的来说它效果很好,但有时我会得到:
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();
其他一些程序会创建这些对象,我的StreamReader想要阅读:
FileOutputStream fileStream = new FileOutputStream(filepath_to_where_listening);
ObjectOutputStream oos = new ObjectOutputStream(fileStream);
oos.writeObject(mmout);
答案 0 :(得分:1)
该文件是否以原子方式创建?或者您是否可能在创建文件时读取文件?
您可以使用.tmp
扩展名创建文件(例如),然后在文件完成后删除扩展程序。这取决于正在使用的文件系统,但我希望这对于大多数(所有?)Unix / Linux文件系统来说都是原子的。
或者,您的编写过程可以编写文件,然后编写相应的标记文件,表明它已完成编写序列化对象(例如objectfile.ser
和objectfile.ser.done
)
另一个解决方案(非常不确定)是监视文件,然后在读取之前等待指定的时间,以允许它完成创建。
答案 1 :(得分:0)
可以由两个考虑因素引起