背景说明
因工作需要,串口波特率使用2M,一秒需要接收150000个字节的数据进行解析并存储至文件中,起初是简单的一个线程直接一路下来,从inputstream
中获取内容之后使用FileOutputStream
写到文件中,结果发现写入到的文件内容经常会出现错乱的情况,怀疑是写入速度跟不上,于是进行了相应的验证,经确认修改为BufferedOutputStream
可以完美解决当前问题。
测试代码
package com.test;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
public class FileTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
FileOutputStream out = null;
FileOutputStream outSTr = null;
BufferedOutputStream Buff = null;
FileWriter fw = null;
int count = 1000;//写文件行数
try {
//FileOutputStream
out = new FileOutputStream(new File("C:\\Users\\95342\\Desktop\\add1.txt"));
long begin = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
out.write("测试java 文件操作\r\n".getBytes());
}
out.close();
long end = System.currentTimeMillis();
System.out.println("FileOutputStream执行耗时:" + (end - begin) + " 毫秒");
//BufferedOutputStream
outSTr = new FileOutputStream(new File("C:\\Users\\95342\\Desktop\\add2.txt"));
Buff = new BufferedOutputStream(outSTr);
long begin0 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Buff.write("测试java 文件操作\r\n".getBytes());
}
Buff.flush();
Buff.close();
long end0 = System.currentTimeMillis();
System.out.println("BufferedOutputStream执行耗时:" + (end0 - begin0) + " 毫秒");
//FileWriter
fw = new FileWriter("C:\\Users\\95342\\Desktop\\add3.txt");
long begin3 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
fw.write("测试java 文件操作\r\n");
}
fw.close();
long end3 = System.currentTimeMillis();
System.out.println("FileWriter执行耗时:" + (end3 - begin3) + " 毫秒");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fw.close();
Buff.close();
outSTr.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
测试结果:
FileOutputStream执行耗时:11 毫秒
BufferedOutputStream执行耗时:1 毫秒
FileWriter执行耗时:6 毫秒
可以看到BufferedOutputStream
明显优于其他方式,具体原因后面再详细整理,先处理完当前需求再说。
评论区