You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ObjectInputStream读取文件时抛出StreamCorruptedException求助

问题解决:StreamCorruptedException 修复方案

核心问题分析

你的错误 StreamCorruptedException: invalid stream header: EFBFBDEF 主要由两个原因导致:

  • 程序退出时未正确关闭 ObjectOutputStream,导致序列化数据写入不完整,文件损坏
  • 空文件直接使用 ObjectInputStream 读取,缺少合法的序列化流头

具体修复步骤

  • 强制关闭输出流:在程序退出前关闭 ObjectOutputStream,确保序列化数据完整写入文件。可以通过添加JVM关闭钩子实现。
  • 检查文件长度:读取前判断文件是否为空,避免读取空文件触发流错误。
  • 优化写入逻辑:每次更新数据时,重新创建输出流覆盖文件(确保每次写入的是完整的ArrayList,避免多次写入导致的流结构混乱),而非复用全局的ObjectOutputStream。
  • 建议修改文件名后缀:将data.txt改为data.dat,避免文本编辑器误修改二进制数据。

修改后的完整代码

import javax.swing.*;
import java.io.*;
import java.util.*;

public class Driver {
    public static ArrayList<BookLibrary> libraries;
    
    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws Exception{
        // 改用二进制文件后缀,避免文本编辑器误操作
        File file = new File("data.dat");
        
        libraries = new ArrayList<>();
        
        // 仅当文件存在且非空时才读取
        if (file.exists() && file.length() > 0) {
            try (ObjectInputStream input = new ObjectInputStream(new FileInputStream(file))) {
                System.out.println("开始读取文件");
                libraries = (ArrayList<BookLibrary>) input.readObject();
                System.out.println("读取完成");
            } catch (EOFException e) {
                System.out.println("文件已读完");
            } catch (ClassNotFoundException e) {
                System.err.println("找不到BookLibrary类定义");
                e.printStackTrace();
            }
        }
        
        // 添加关闭钩子,程序退出时自动保存数据
        Runtime.getRuntime().addShutdownHook(new Thread(Driver::update));
        
        Frame frame = new Frame(libraries);
    }
    
    public static void update() {
        // 每次更新时重新创建输出流,覆盖写入完整的ArrayList
        try (ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("data.dat"))) {
            output.writeObject(libraries);
            output.flush();
            System.out.println("数据已保存");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

额外注意事项

  • 确保BookLibrary类及其所有成员变量都实现了Serializable接口,且serialVersionUID保持一致
  • 不要手动用文本编辑器打开data.dat文件,避免二进制数据被破坏
  • 使用try-with-resources语法(try(...))可以自动关闭流,无需手动调用close(),避免资源泄漏

内容的提问来源于stack exchange,提问作者ProfessorChicken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 11:17:49