我有一个应用程序,用Java序列化和读取/写入一些自定义对象。
我的一个客户端有一个特定文件(只有一个),只要文件被读入EOFException
构造函数,就会抛出ObjectInputStream
。
java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
java.io.ObjectInputStream.readStreamHeader(Unknown Source)
java.io.ObjectInputStream.(Unknown Source)
编辑:抱歉,我的错误。我忘了提到我通过这段代码收到了文件:
File folder = new File(path);
File[] files = folder.listFiles();
因此,就File#listFiles()
正在检索文件而言,文件确实存在。
因此,从循环中收到以下代码中的file
:
for(File file : files)
因此,IOException
不应该来自丢失的文件(因为listFiles()
为什么要返回它?)。
END-EDIT
我想这可能是由于对象的部分写入失败导致的故障,所以我添加了代码来删除问题文件,如果有EOFException
:
try (InputStream is = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(is);) {
// Do stuff...
} catch (IOException e) {
if(e instanceof EOFException) {
file.delete();
}
ErrorHandler.handleError(e);
}
虽然此代码成功执行,但实际上并不删除该文件。 (我仍然不断看到日志中的错误)。所以,我选择让我的客户端手动搜索并删除此文件。他搜索,发现并删除了它。他向我确认它已成功删除该文件。但是,即使他手动删除它,这个错误仍然会弹出!
虽然这是一个Java程序,但我怀疑这是一个Windows文件系统故障,因此Java与此无关。有没有人有“鬼”文件的经验,似乎在那里,但不是?或者似乎被删除了但是没有?
这是一个令人困惑的问题。我不可能重现。
答案 0 :(得分:0)
文件为空,或者不包含完整的对象流标头。在任何一种情况下它都是腐败的,你应该在编写时检测到它。
创建文件时可能无法关闭ObjectOutputStream
。