ObjectInputStream构造函数的EOFException

时间:2014-01-21 22:46:50

标签: java serialization file-io objectinputstream

我有一个应用程序,用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与此无关。有没有人有“鬼”文件的经验,似乎在那里,但不是?或者似乎被删除了但是没有?

这是一个令人困惑的问题。我不可能重现。

1 个答案:

答案 0 :(得分:0)

文件为空,或者不包含完整的对象流标头。在任何一种情况下它都是腐败的,你应该在编写时检测到它。

创建文件时可能无法关闭ObjectOutputStream