当前位置: 首页 > news >正文

java在文本追加内容时候发现数据丢失问题

最近在做清洗数据的工作,使用BufferedWriter类用来追加文本内容,测试时候发现没有问题,拿到生成时候发现过大时丢失数据。

核心代码如下:

FileOutputStream fos = new FileOutputStream(saveFile, true);
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter writer = new BufferedWriter(osw);
while (true){
    if (page % 10 == 0) {
        System.out.println(page + " 能被 500 整除。");
        saveFile = localTempPath + "dbSave" + page + ".sql";
        fos = new FileOutputStream(saveFile, true);
        osw = new OutputStreamWriter(fos, "UTF-8");
        writer = new BufferedWriter(osw);
    }
    String data = getShopownerSpecialDataStatisticsDbData(page).toString();
    if(!StringUtils.isBlank(data)){
        writer.write(data);
        writer.newLine();
        page++;
    }
}

精确定位之后打开文本内容如下:


发现解析的字符串内容丢失了一半,甚至不解,最终通过AI搜索 找到问题原因,原来是没进行flush()刷新缓存区,导致。解释如下:

BufferedWriter 内部有一个缓冲区,数据会先被写入到这个缓冲区,只有当缓冲区满了或者手动调用 flush() 方法,或者关闭 BufferedWriter 时,缓冲区中的数据才会被真正写入到目标文件或输出流中。如果在写入大量数据过程中没有及时刷新缓冲区,可能会导致部分数据还留在缓冲区而未被写入文件,从而造成数据丢失。

最终加上flush()方法解决了此问题,demo代码如下:

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterExample {
    public static void main(String[] args) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt", true))) {
            // 模拟大量数据
            for (int i = 0; i < 100000; i++) {
                writer.write("This is a test line " + i + "\n");
                // 每写入 1000 行数据就刷新一次缓冲区
                if (i % 1000 == 0) {
                    writer.flush();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

相关文章:

  • 3.4 AI Agent体验设计革命:从界面美学到情感化交互的企业级设计指南
  • Mybatisplus自定义sql
  • 自然语言生成(NLG)与理解(NLU)的核心差异
  • Django ModelForm使用(初学)
  • 学习和掌握javaWeb
  • ELK组成及实现原理
  • pg认证需要培训机构吗
  • 【实战篇】DeepSeek全自动视频工厂搭建指南
  • 大语言模型常用微调与基于SFT微调DeepSeek R1指南
  • LLM赋能6-web端Chatbot再更新(待续)
  • c语言(函数)
  • 【MySQL】表的基本操作
  • java原子操作类实现原理
  • 李宏毅机器学习笔记:【6.Optimization、Adaptive Learning Rate】
  • 基于实例详解pytest钩子pytest_generate_tests动态生成测试的全过程
  • 并发编程---synchronized关键字,以及synchronized同步锁
  • 编译RV1126SDK记录
  • API密钥是什么
  • src和href区别
  • 《C语言动态顺序表:从内存管理到功能实现》
  • 以色列在加沙发起新一轮强攻,同步与哈马斯展开无条件谈判
  • 一女游客在稻城亚丁景区因高反去世,急救两个多小时未能恢复生命体征
  • 家国万里·时光故事会|构筑中国船舰钢筋铁骨,她在焊花里展现工匠风范
  • 2025全球城市科技传播能力指数出炉,上海位列第六
  • 朱雀二号改进型遥二运载火箭发射成功
  • 80后女博士黄双燕拟提名为内蒙古盟市政府(行署)副职人选