如何在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
相关产品推荐
相关产品推荐

