2009-06-26 4 views
3

ファイルを開き、別の関数に渡してデータを書き込むメソッドがあります。その2番目のメソッドは、PrintWriterを使用してデータを書きたいと考えています。しかし、誰もがそのストリームに書き込むためにPrintWriterを使用する必要はありませんでした。私は「pr.flushを入れない限り、JavaのOutputStreamでライターを切り替える

現在それが、これは動作しません

public void exportRawDataIntoStream(OutputStream os) { 
    PrintWriter pr = new PrintWriter(os); 
    printFirstData(pr); 
    printSecondData(pr); 
} 

public void exportToFile(File file) { 
    OutputStream os = null; 
    try { 
     os = new BufferedOutputStream(new FileOutputStream(file)); 
     exportRawDataIntoStream(os); 
       doMoreWithTimeFile(os); 
    } finally { 
     if (os != null) { 
      try { 
       os.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

(メソッドや変数名の私の選択を批判気にしないでください消毒例...)このようになります'は、exportRawDataIntoStreamの最後にあります。私はPrintWriterを閉じることができません。これはストリーム全体を閉じるためです。

フラッシュは正統で信頼できるものですか? Writerを同じストリームに混在させるために使用すべき他のアプローチがありますか、それとも決してそれを行うべきではありませんか?

答えて

4

はい、フラッシュは信頼できるものでなければなりません。基本的な役割は、余分なデータを「追い出す」ことです。

しかし、公正であるためには、あなたの基本的な作家でのみ動作します。マインド、私はそれがすべてではないにしても、ほとんどだと思う。

しかし、考案された特別な種類の作家を考えてみましょう。近いうちに "何か他のことをする"もの。暗号化または圧縮ストリームのように。

"base64エンコーダライター"があります。潜在的に末尾の "=="をDONEになるまで安全に書き込むことはできません。これは、フラッシュではなくクローズです。

しかし、この警告では、PrintWriterの場合は問題ではありません。

+0

他のストリームをラップするWritersとOutputStreamの実装は、close()が実際に基本ストリームを閉じるかどうかによって異なります。場合によっては、基になるストリームが閉じられないことがわかっている場合は、close()を呼び出すことができます。 – JimN

+0

圧縮ストリームのようなものは、通常、下にあるストリームを閉じることなく出力を処理するためのfinish()メソッドなどを持っています。 –

+0

そうです、それはいつも混乱の点でした。 「クローズ」はチェーン全体を閉じることになっていると私は理解していますが、あなたが言うように、あるものはそうするものもあればそうでないものもあります。 –

関連する問題