java写文件这个应用场景相信是所有java开发者最常用的操作了,从jdk1.7以来到底选择哪一种方式写文件,借周末的时间,简单写了几个常用的FileOutputStream、BufferedOutputStream、FileWriter、BufferedWriter,具体代码如下:
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
/**
* 写文件性能测试
*
* @author 李小强
* @since jdk1.6
* @version 2017年7月10日 李小强
*/
public class FileTest {
/**
* 构造函数
*/
public FileTest() {
}
/**
* FIXME 方法注释信息(此标记由Eclipse自动生成,请填写注释信息删除此标记)
*
*
*
*
按写五千、一万、五万、十万、五十万、一百万、五百万行代码,每轮执行十次,取最大、最小、平均值,测试结果如下:
一次性写5000行大小的文件 | 一次性写10000行大小的文件 | ||||||||
第N次 | FileOutputStream | BufferedOutputStream | FileWriter | BufferedWriter | 第N次 | FileOutputStream | BufferedOutputStream | FileWriter | BufferedWriter |
1 | 63 | 4 | 25 | 10 | 93 | 13 | 64 | 9 | |
2 | 60 | 32 | 50 | 3 | 39 | 17 | 8 | 4 | |
3 | 30 | 10 | 6 | 7 | 34 | 4 | 17 | 7 | |
4 | 18 | 2 | 90 | 4 | 33 | 102 | 4 | 4 | |
5 | 18 | 4 | 3 | 4 | 34 | 4 | 4 | 4 | |
6 | 17 | 3 | 2 | 3 | 33 | 100 | 4 | 4 | |
7 | 23 | 3 | 3 | 3 | 32 | 4 | 5 | 3 | |
8 | 19 | 3 | 3 | 2 | 80 | 4 | 4 | 4 | |
9 | 17 | 3 | 3 | 3 | 35 | 4 | 4 | 4 | |
10 | 17 | 3 | 3 | 8 | 34 | 4 | 4 | 3 | |
平均值 | 28.2 | 6.7 | 18.8 | 4.7 | 平均值 | 44.7 | 25.6 | 11.8 | 4.6 |
最大值 | 63 | 32 | 90 | 10 | 最大值 | 93 | 102 | 64 | 9 |
最小值 | 17 | 2 | 2 | 2 | 最小值 | 32 | 4 | 4 | 3 |
一次性写50000行大小的文件 | 一次性写100000行大小的文件 | ||||||||
第N次 | FileOutputStream | BufferedOutputStream | FileWriter | BufferedWriter | 第N次 | FileOutputStream | BufferedOutputStream | FileWriter | BufferedWriter |
1 | 244 | 18 | 66 | 25 | 1 | 541 | 31 | 81 | 27 |
2 | 184 | 11 | 13 | 12 | 2 | 452 | 29 | 25 | 19 |
3 | 192 | 15 | 14 | 12 | 3 | 395 | 35 | 24 | 18 |
4 | 210 | 10 | 13 | 11 | 4 | 382 | 44 | 24 | 18 |
5 | 190 | 11 | 16 | 11 | 5 | 379 | 25 | 25 | 19 |
6 | 189 | 11 | 17 | 12 | 6 | 356 | 24 | 26 | 18 |
7 | 184 | 15 | 13 | 11 | 7 | 382 | 28 | 25 | 59 |
8 | 186 | 11 | 14 | 11 | 8 | 381 | 22 | 23 | 19 |
9 | 178 | 13 | 13 | 11 | 9 | 372 | 24 | 69 | 20 |
10 | 183 | 12 | 12 | 11 | 10 | 372 | 20 | 24 | 17 |
平均值 | 194 | 12.7 | 19.1 | 12.7 | 平均值 | 401.2 | 28.2 | 34.6 | 23.4 |
最大值 | 244 | 18 | 66 | 25 | 最大值 | 541 | 44 | 81 | 59 |
最小值 | 178 | 10 | 12 | 11 | 最小值 | 356 | 20 | 23 | 17 |
一次性写500000行大小的文件 | 一次性写1000000行大小的文件 | ||||||||
第N次 | FileOutputStream | BufferedOutputStream | FileWriter | BufferedWriter | 第N次 | FileOutputStream | BufferedOutputStream | FileWriter | BufferedWriter |
1 | 1794 | 94 | 156 | 114 | 1 | 3573 | 204 | 282 | 173 |
2 | 1600 | 87 | 129 | 80 | 2 | 3238 | 182 | 204 | 179 |
3 | 1577 | 81 | 98 | 81 | 3 | 3316 | 177 | 254 | 199 |
4 | 1588 | 81 | 99 | 81 | 4 | 4248 | 176 | 207 | 164 |
5 | 1579 | 82 | 97 | 82 | 5 | 3278 | 169 | 210 | 191 |
6 | 1566 | 83 | 114 | 116 | 6 | 3328 | 184 | 224 | 171 |
7 | 1579 | 91 | 101 | 82 | 7 | 3509 | 183 | 201 | 164 |
8 | 1639 | 81 | 111 | 81 | 8 | 3228 | 168 | 223 | 162 |
9 | 1608 | 84 | 96 | 79 | 9 | 3230 | 216 | 207 | 166 |
10 | 1583 | 80 | 105 | 80 | 10 | 3183 | 163 | 226 | 191 |
平均值 | 1611.3 | 84.4 | 110.6 | 87.6 | 平均值 | 3413.1 | 182.2 | 223.8 | 176 |
最大值 | 1794 | 94 | 156 | 116 | 最大值 | 4248 | 216 | 282 | 199 |
最小值 | 1566 | 80 | 96 | 79 | 最小值 | 3183 | 163 | 201 | 162 |
最后结论是:BufferedWriter占了绝对优势,而FileOutputStream是最差,并且性能相差好多倍建议使用BufferedWriter;当然还有好多方案没测试,欢迎大写补充