JAva API書き込みテキストファイル比較FileOutputStream,BufferedOutputStream,FileWriter

4197 ワード

最近のプロジェクトでは大きなファイルを操作するために、JAVA ioのテストをしました.
Java.ioパッケージのFileOutputStreamの場合、BufferedOutputStreamとFileWriterの3つの異なるクラスがテキストファイルのパフォーマンスに書き込まれます.
テストコードと結果は次のとおりです.
環境:マシンibm thinkpad 61 i、
構成:2.0 GデュアルコアCPU、2 Gメモリ、オペレーティングシステムxp sp 2、java api 1.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 
".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
" .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
"); } 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.4 KBの書き込みサイズ:
FileOutputStream実行時間:31豪秒
BufferedOutputStream実行時間:16豪秒
FileWriter実行時間:0豪秒
2.count=10,000の、すなわち、10,000行を書く場合、664 KBのファイルサイズが書かれます.
FileOutputStream実行時間:78豪秒
BufferedOutputStream実行時間:32豪秒
FileWriter実行時間:15豪秒
3.count=100,000、すなわち、書き込みファイル100,000行の場合、書き込みファイルサイズは6.7 MB:
FileOutputStream実行時間:453豪秒
BufferedOutputStream実行時間:172豪秒
FileWriter実行時間:156豪秒
4.count=1,000,000の、つまり1,000,000行の書き込みの場合、書き込みファイルサイズは64.8 MB:
FileOutputStream実行時間:4500豪秒
BufferedOutputStream実行時間:2422豪秒
FileWriter実行時間:2500豪秒
5.count=10,000、すなわち、書き込みファイル10,000,000行の場合、書き込みファイルサイズは648 MB:
FileOutputStream実行時間:52453豪秒
BufferedOutputStream実行時間:25921豪秒
FileWriter実行時間:36094豪秒
FileOutputStream実行時間:51547豪秒
BufferedOutputStream実行時間:35203豪秒
FileWriter実行時間:31609豪秒
FileOutputStream実行時間:50078豪秒
BufferedOutputStream実行時間:33515豪秒
FileWriter実行時間:29516豪秒
以上のデータから,バッファフローBufferedOutputStreamを用いなければ,FileOutputStreamがファイルを書くロバスト性はよくないことが分かる.10,000行のファイルを書く場合、FileOutputStreamはFileWriterより10,000-21,000ミリ秒遅い(10-21秒).
この数秒の時間を軽視してはいけない.操作するデータ量が大きいと、この点の性能の差が大きくなります.データベースを操作してjavaでエクスポートして数億件のレコードファイルを生成する場合、待ち時間は10分以上かかり、性能の差が大きくなります.