我有一个应用程序可以序列化和读取/写入 Java 中的一些自定义对象。
我的一个客户有一个特定的文件(只有一个),每当文件被读入 ObjectInputStream
构造函数时,该文件就会抛出 EOFException
。
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()
会返回它?)。
结束-编辑
我认为这可能是由于对象的部分写入失败引起的故障,所以我添加了代码以在存在 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 与此无关。有没有人有过似乎存在但实际上不存在的“幽灵”文件的经验?或者看起来好像被删除了但实际上并没有?
这是一个令人困惑的问题。我无法重现。
最佳答案
文件为空,或不包含完整的对象流 header 。无论哪种情况,它都是损坏的,您应该在编写它时检测到这一点。
可能是您在创建文件时未能关闭 ObjectOutputStream
。
关于java - 来自 ObjectInputStream 构造函数的 EOFException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21270672/