2009-05-25 21 views
34

をフラッシュするとき、私はしてFileWriterをラップBufferedWriterのを持っている、と私は(書き込みを呼び出して)多くの多くの回...結果のファイルはかなり大きいです...Javaプログラム(Javaの1.5)でBufferedWriterの

このファイルの行のうち、いくつかは不完全です...

私は何か書きます(しかし、それは非効率だと思われます)か、別の方法のBufferedWriterを使うか、別のクラスを使用する必要があります...?

(私は書くために何百もの行を書きましたので、かなり効率的なものを作りたいと思っています) 理想的な "フラッシング"の瞬間は何でしょうか? (私はBufferedWriterの容量に達したとき)...

INIT:

try { 
    analysisOutput = new BufferedWriter(new FileWriter(
     "analysisResults", true)); 
    analysisOutput.newLine(); 
    analysisOutput.write("Processing File " + fileName + "\n"); 
} 
catch (FileNotFoundException ex) { 
    ex.printStackTrace(); 
} 
catch (IOException ex) { 
    ex.printStackTrace(); 
} 

執筆:

private void printAfterInfo(String toBeMoved,HashMap<String, Boolean> afterMap, Location location) 
    throws IOException { 
    if(afterMap != null) { 
     for (Map.Entry<String, Boolean> map : afterMap.entrySet()) { 
     if (toBeMoved == "Condition") { 
      if (1 <= DEBUG) 
      System.out.println("###" + toBeMoved + " " + location + " " 
       + conditionalDefs.get(conditionalDefs.size() - 1) 
       + " After " + map.getKey() + " " 
       + map.getValue() + "\n"); 

      analysisOutput.write("###" + toBeMoved + " " + location + " " 
       + conditionalDefs.get(conditionalDefs.size() - 1) 
       + " After " + map.getKey() + " " + map.getValue() 
       + "\n"); 
     } else { 
      if (1 <= DEBUG) 
      System.out.println("###" + toBeMoved + " " + location + " " 
       + map.getKey() + " After " 
       + map.getValue() + "\n"); 
      if (conditionalDefs.size() > 0) 
      analysisOutput.write("###" + toBeMoved + " " + location + " " 
       + conditionalDefs.get(conditionalDefs.size() - 1) + " " 
       + map.getKey() + " After " + map.getValue() 
       + "\n"); 
      else 
      analysisOutput.write("###" + toBeMoved + " " + location + " " + map.getKey() + " After " + map.getValue() + "\n"); 


     } 
     } 
    } 

私は不完全である行がちょうどそれらであることを考え出しました「処理ファイル」の前に...分析する1つのファイルから別のファイルに切り替えるときに発生する...

終了:

dispatch(unit); 

try { 
    if (analysisOutput != null) { 
    printFileInfo(); 
    analysisOutput.close(); 
    } 
} 
catch (IOException ex) { 
    ex.printStackTrace(); 
} 

時々printFileInfoでプリントアウトした情報が結果ファイルには表示されません...

+0

不完全ですが、複数のスレッドに書き込んでいますか? IIRC BufferedWriterはスレッドセーフではありませんので説明になるかもしれませんが、より多くのスペースを確保するために「手動でフラッシュする」必要はありません。 –

+0

質問がよく分からない場合は、明らかになるコードサンプルまたは出力サンプルを用意してください。 –

+0

実際にはスレッドセーフです(Writerデコレータはどのオブジェクトをロックするかについて合意することに問題があります)。 –

答えて

74

BufferedWriterは、バッファをいっぱいにするとすでにフラッシュされます。 BufferedWriter.writeのドキュメントから:

通常、このメソッドは、このストリームのバッファに指定された配列から文字を格納を必要に応じて は、基本となるストリームにバッファをフラッシュします。

(重点鉱山。)

BufferedWriterのポイントは、それは通常、より効率的な(しかしためのコードへの痛みのより)だとして、はるかに少ない大きな書き込みに少し書き込みの多くを統合する基本的です。 が終了したらが終了したことを確認してからclose()と呼ぶと、元のライターをフラッシュ/クローズすること以外は、正しく動作させるために特別な処理を行う必要はありません。

つまり、書き込み、書き込み、書き込み、閉じるだけでリラックスすることができます。flushを通常呼び出す必要があるのは、本当に本当に本当にデータがディスクに保存されている必要がある場合です。 (例えば、あなたが永久ロガーを持っているならば、ログを読んでいる人はバッファがいっぱいになってから新しいログエントリを見るまで待つ必要はないので、頻繁にフラッシュしたいかもしれません!)

+0

テスト済みで承認済みです。行ごとに10Mbの数字を書きました。各行に書き込んだ後にフラッシュします。フラッシュすることなく7秒かかります.4秒。 –

8

あなたが書かれていたデータを参照するファイルを読み込む別のプログラムが必要なときに理想的なフラッシングモーメントがファイルの前に、あります閉じています。多くの場合、それは決してありません。

+0

BufferedWriterが大きい場合でも...私は中間段階でそれを行う必要はありませんか? – LB40

+0

バッファがいっぱいになると、その内容がディスクに書き出されます。 BufferedWriter APIは、ファイルが閉じられる前にデータを消費することを除いて、FileWriterのドロップイン置換であるように設計されています。 – Dave

関連する問題