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

如何在Java中向.dat文件写入数据且不覆盖原有内容

问题根因

  • 你当前使用的FileOutputStream单参数构造方法默认是覆盖写入模式,要追加内容需要传入第二个参数true开启追加模式
  • 原代码没有调用writeObject方法写入实际的List数据,就算不处理覆盖问题,运行后也不会把目标内容写入文件
  • Java原生ObjectOutputStream初始化时会自动写入序列化头信息,如果每次追加都新建实例,会导致文件内存在多份序列化头,后续读取时会抛出StreamCorruptedException异常,需要额外处理

修复后可用代码

public static void fileData(List<? extends Loggable> l, String pathName) throws IOException {
    var file = new File(pathName);
    // 第二个参数true开启追加写入模式,不覆盖原有内容
    var fileOut = new FileOutputStream(file, true);

    ObjectOutputStream objOut;
    if (file.length() == 0) {
        // 文件为空时正常创建ObjectOutputStream,写入标准序列化头
        objOut = new ObjectOutputStream(fileOut);
    } else {
        // 文件非空时创建匿名子类,重写writeStreamHeader避免额外写入流头
        objOut = new ObjectOutputStream(fileOut) {
            @Override
            protected void writeStreamHeader() throws IOException {
                // 不写入流头,避免读取时报错
                reset();
            }
        };
    }
    
    // 写入实际需要持久化的List数据
    objOut.writeObject(l);

    objOut.close();
    fileOut.close();
}

读取注意事项

后续读取该.dat文件时,循环调用ObjectInputStream.readObject()直到捕获到EOFException,即可读取到所有历史写入的序列化对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:39:01