對於java.io包中的FileOutputStream,BufferedOutputStream和FileWriter三個不同類寫入到文字檔效能,
測試代碼和結果如下:
環境: 機器ibm thinkpad 61i,
配置:2.0G雙核CPU,2G記憶體,作業系統xp sp2,java api1.5.
- import
java.io.BufferedOutputStream;
- import
java.io.File;
- import
java.io.FileOutputStream;
- import
java.io.FileWriter;
- public
class
TestTxtWriter {
-
public
TestTxtWriter() {
- }
-
public
static
void
main(String[] args) {
- FileOutputStream out =
null
;
- FileOutputStream outSTr =
null
;
- BufferedOutputStream Buff =
null
;
- FileWriter fw =
null
;
-
int
count =
10000000
;
// 寫檔案行數
-
try
{
- out =
new
FileOutputStream(
new
File(
"D:/FileOutputStream.txt"
));
-
long
begin = System.currentTimeMillis();
-
for
(
int
i =
0
; i < count; i++) {
- out.write(
"測試FileOutputStream,BufferedOutputStream和FileWriter,對檔案寫操作/r/n"
.getBytes());
- }
- out.close();
-
long
end = System.currentTimeMillis();
- System.out.println(
"FileOutputStream執行耗時:"
+ (end - begin) +
" 豪秒"
);
- outSTr =
new
FileOutputStream(
new
File(
"D:/BufferedOutputStream.txt"
));
- Buff =
new
BufferedOutputStream(outSTr);
-
long
begin0 = System.currentTimeMillis();
-
for
(
int
i =
0
; i < count; i++) {
- Buff.write(
"測試FileOutputStream,BufferedOutputStream和FileWriter,對檔案寫操作/r/n"
.getBytes());
- }
- Buff.flush();
- Buff.close();
-
long
end0 = System.currentTimeMillis();
- System.out.println(
"BufferedOutputStream執行耗時:"
+ (end0 - begin0) +
" 豪秒"
);
- fw =
new
FileWriter(
"D:/FileWriter.txt"
);
-
long
begin3 = System.currentTimeMillis();
-
for
(
int
i =
0
; i < count; i++) {
- fw.write(
"測試FileOutputStream,BufferedOutputStream和FileWriter,對檔案寫操作/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();
}
}
}
}
以下結果經過多次執行,取常出現的資料,由於只是簡單比較,不做詳細統計。
1.當count=1 000的,即寫檔案1 000行的時候,寫出的檔案大小為66.4KB:
FileOutputStream執行耗時:31 豪秒
BufferedOutputStream執行耗時:16 豪秒
FileWriter執行耗時:0 豪秒
2.當count=10 000的,即寫檔案10 000行的時候,寫出的檔案大小為664KB:
FileOutputStream執行耗時:78 豪秒
BufferedOutputStream執行耗時:32 豪秒
FileWriter執行耗時:15 豪秒
3.當count=100 000的,即寫檔案100 000行的時候,寫出的檔案大小為6.7MB:
FileOutputStream執行耗時:453 豪秒
BufferedOutputStream執行耗時:172 豪秒
FileWriter執行耗時:156 豪秒
4.當count=1 000 000的,即寫檔案1 000 000行的時候,寫出的檔案大小為64.8MB:
FileOutputStream執行耗時:4500 豪秒
BufferedOutputStream執行耗時:2422 豪秒
FileWriter執行耗時:2500 豪秒
5.當count=10 000 000的,即寫檔案10 000 000行的時候,寫出的檔案大小為648MB:
FileOutputStream執行耗時:52453 豪秒
BufferedOutputStream執行耗時:25921 豪秒
FileWriter執行耗時:36094 豪秒
FileOutputStream執行耗時:51547 豪秒
BufferedOutputStream執行耗時:35203 豪秒
FileWriter執行耗時:31609 豪秒
FileOutputStream執行耗時:50078 豪秒
BufferedOutputStream執行耗時:33515 豪秒
FileWriter執行耗時:29516 豪秒
由
以上資料可以看到,如果不用緩衝流BufferedOutputStream,FileOutputStream寫檔案的魯棒性是很不好的。當寫 10
000 000行的檔案的時候,FileOutputStream比FileWriter要慢10 000-21 000毫秒(10-21秒)。
不要小看這幾秒的時間。當操作的資料量很大的時候,這點效能的差距就會很大了。在操作資料庫,通過java匯出產生數億條記錄檔案的時候,等待的時間要10分鐘以上,效能相差大了。