【发布时间】:2014-02-11 18:53:55
【问题描述】:
我有一个应用程序可以序列化和读取/写入 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 与此无关。有没有人对似乎存在但不存在的“幽灵”文件有经验?或者似乎被删除但没有被删除?
这是一个令人困惑的问题。我无法复制。
【问题讨论】:
-
嗯,
IOException可能是“找不到文件”。 -
在 SO 上寻求帮助的第一条规则是发布 整个 堆栈跟踪。无论如何,请注意 EOF 发生在
ObjectInputStream$PeekInputStream中,因此 OIS 正在“启动泵”,可以这么说。很明显,该文件没有包含足够的数据来创建一个完整的对象,并且要么是空的,要么已损坏,要么被另一个进程独占锁定,这就解释了为什么你不能删除它。 -
@BrianRoach,对不起。我忘记在问题中添加一些关键细节。但是
IOException不会来自未找到的文件。请阅读上面的编辑。 -
@JimGarrison,这是有道理的,除了
file.delete()不会抛出错误。另外,这不能解释为什么我的客户(通过 Windows 资源管理器)认为他删除了文件但没有。 -
File.delete() 不会抛出异常。它返回一个布尔值。
标签: java serialization file-io objectinputstream