在平时开发中,需要向文件中写数据的操作,用的非常多,java中比较常用的类有FileOutputStream、BufferedOutputStream和BufferedWriter,这三个类在写文件的速度上有些差异,下面通过测试看一下差异有多大,
测试场景是,向文件写入循环写入数据:
public class Trade {
// 先设定写入10000行数据
private static final int COUNT = 100000;
/**
* 比较时间
*/
public void compareTime() {
System.out.println("====start======");
useFileOStream();
useBufferOStream();
useBufferedWriter();
System.out.println("=====end========");
}
/**
* 使用FileOutputStream
*/
public void useFileOStream() {
try {
File file = new File("text01.txt");
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file,true);
long begin = System.currentTimeMillis();
for (int i = 0; i < COUNT; i++) {
fos.write("java--测试写文件 fos\r\n".getBytes());
}
fos.flush();
fos.close();
System.out.println("FileOutputStream执行耗时: " + (System.currentTimeMillis() - begin));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 使用BufferedOutputStream
*/
public void useBufferOStream() {
try {
File file = new File("text02.txt");
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file,true);
BufferedOutputStream bos = new BufferedOutputStream(fos);
long begin = System.currentTimeMillis();
for (int i = 0; i < COUNT; i++) {
bos.write("java--测试写文件 fos\r\n".getBytes());
}
bos.flush();
bos.close();
System.out.println("BufferedOutputStream执行耗时: " + (System.currentTimeMillis() - begin));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 使用Filewriter
*/
public void useBufferedWriter() {
try {
File file = new File("text03.txt");
if (!file.exists()) {
file.createNewFile();
}
// 一次写入的文件大小小于10M时, bufferedWriter并不能显著降低时间,而且此时BufferedOutputStream仍是占优的
FileWriter fWriter = new FileWriter(file,true);
BufferedWriter bufferedWriter = new BufferedWriter(fWriter);
long begin = System.currentTimeMillis();
for (int i = 0; i < COUNT; i++) {
bufferedWriter.write("java--测试写文件 fos\r\n");
}
bufferedWriter.flush();
bufferedWriter.close();
System.out.println("BufferedWriter 执行耗时: " + (System.currentTimeMillis() - begin));
} catch (IOException e) {
e.printStackTrace();
}
}
}
新建一个测试类:
public class Test {
public static void main(String[] args) {
Trade trade = new Trade();
// 测试写入操作的速度
trade.compareTime();
}
}
当一次写入100000行字符串时,执行耗时如下:
====start======
FileOutputStream执行耗时: 250ms
BufferedOutputStream执行耗时: 15ms
BufferedWriter 执行耗时: 31ms
=====end========
当一次写入300000行字符串时(文件大小为6446kb),执行耗时如下:
====start======
FileOutputStream执行耗时: 642ms
BufferedOutputStream执行耗时: 47ms
Filewriter执行耗时: 46ms
=====end========
当一次写入500000行字符串时(文件大小为10M),执行耗时如下:
====start======
FileOutputStream执行耗时: 1139ms
BufferedOutputStream执行耗时: 79ms
BufferedWriter 执行耗时: 63ms
=====end========
当一次写入1000000行字符串时(文件大小为20.9M),执行耗时如下:
====start======
FileOutputStream执行耗时: 2097ms
BufferedOutputStream执行耗时: 142ms
BufferedWriter 执行耗时: 109ms
=====end========
由此可见,FileOutputStream不管什么时候,写入速度都是最慢的,BufferedOutputStream在写入的数据量不算大的情况下,速度比BufferedWriter要快,但当数据量变大时(>6M),BufferedWriter的写入速度是最快的。
根据测试结果,在实际开发中提高效率,我们可以灵活选用java的io类:数据量小的时候,选择BufferedOutputStream,数据量大的时候,选择BufferedWriter