java - 来自 ObjectInputStream 构造函数的 EOFException

标签 java serialization file-io objectinputstream

我有一个应用程序可以序列化和读取/写入 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/

相关文章:

java - 序列化给出了错误的对象大小

java - 关闭嵌套的阅读器

visual-studio-2008 - 从 Visual Studio 2008 中的文件读取输入

java - 了解 java 或 GWT 中的组合

java - 尝试调用 Web 服务调用时访问被拒绝

java - 解密Android RSA : Invalid Ciphertext Exception

android - 如何删除整个文件夹和内容?

java - 在 spring 中使用注解时出现错误

c# - EndOfStreamException 与简单的 BinaryWriter 和 BinaryReader

java - 我需要同步 writeObject() 吗?