【问题标题】:EOFException from ObjectInputStream constructor来自 ObjectInputStream 构造函数的 EOFException
【发布时间】: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


【解决方案1】:

文件为空,或不包含完整的对象流标头。无论哪种情况,它都是损坏的,您应该在编写它时就检测到它。

可能您在创建文件时未能关闭ObjectOutputStream

【讨论】:

  • 关闭失败应该导致ObjectInputStream#readObject() 抛出一个错误,但是这个错误是在构造函数上抛出的,而不是在readObject() 上。问题是,为什么构造函数会抛出错误?
  • 你错了。失败的关闭可能导致 readObject() 或构造函数抛出异常。构造函数读取了一个流标头。请参阅 Javadoc。如果它不完全存在,你就会得到你所得到的。您应该调查的是失败的关闭。
猜你喜欢
  • 2012-09-10
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
相关资源
最近更新 更多