最近在做清洗数据的工作,使用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();
}
}
}