2

base64 でエンコードされたデータをファイルに書き込み、オンザフライでデコードしたいと考えています。私は持っている

BufferedWriter bw = new BufferedWriter(
  new OutputStreamWriter(
    new Base64OutputStream(
      new FileOutputStream(myFile, false)));

私はこれがうまくいくと思います、そして私のfinallyブロックで私は呼び出しますbw.close()- つまり、一番外側のラッパーを閉じます。それだけで十分ですか、それとも匿名の中間オブジェクトの一部が漏洩するのでしょうか?

コードを調べてみましたが、Sun 独自の OutputStreamWriter のエンコーディング ハンドラの実装で行き詰まりました。また、ドキュメントに明示的に記載されていないようです。

4

3 に答える 3

3

最善の方法は、最も外側のストリーム オブジェクトを閉じることです。それが正しく実装されていると仮定すると、これはclose()ラップするオブジェクトを呼び出し、クローズはチェーンを伝播します...正しいことを行います。

出力パイプラインの場合、実際にはこのようにすることが重要です。最も内側の出力ストリーム/ライターのみを閉じると、バッファリングされた出力 (パイプラインのどこか) が適切に書き込まれない可能性があります。

于 2013-09-29T12:08:52.170 に答える
2

BufferedWriter は AutoClosableを拡張するため、Java 7 でtry-with-resources ステートメントを使用して、リソースが範囲外になったときにリソースを自動的に閉じることができます。

try(BufferedWriter bw = new BufferedWriter(
  new OutputStreamWriter(
    new Base64OutputStream(
      new FileOutputStream(myFile, false)));
   ) {

      // bw.write(); 

} catch(XXXException ex) {
    // Catch Block.
}

try-with-resources ステートメントにより、ステートメントの最後で各リソースが確実に閉じられます。

また、コードはこのようにきれいに見えます。

于 2013-09-29T12:22:22.553 に答える