• 締切済み

BufferedWriterのcloseメソッド

ファイル出力に関して、次のようなコードをよく目にします。 例外処理省略 FileOutputStream fos = new FileOutputStream("hoge.txt"); OutputStreamWriter osw = new OutputStreamWriter(fos); BufferedWriter bw = new BufferedWriter(osw); //ファイルに出力 bw.close(); osw.close(); fos.close(); 同様の処理で、次のようなコードも目にします。 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("hoge.txt"))); //ファイルに出力 bw.close(); 下のコードで、関連するソースを見てみると、BufferedWriterオブジェクトをcloseする際に、そのオブジェクトが参照を持っているOutputStreamWriterオブジェクトはcloseされているように見えるのですが、FileOutputStreamオブジェクトがcloseされているようには見えませんでした。 下のようなコードは安全といえるのでしょうか?BufferedWriterオブジェクトのcloseで引数として渡される各オブジェクトもcloseされるのでしょうか?

みんなの回答

  • Kilm
  • ベストアンサー率87% (7/8)
回答No.1

BufferedWriter#closeはコンストラクタで受け取ったWriter#closeメソッドを呼び出しますが、 OutputStreamWriter#closeはコンストラクタで受け取ったFileOutputStreamではなく FileOutputStreamから作り出した別のオブジェクトのcloseを呼び出します。 なので下ではFileOutputStreamのcloseが呼ばれず、 先程作り出した別のオブジェクトのcloseを呼んでいます。 …直接呼ばれていないだけかもしれないですけど… 上のコードでも bw.close(); // 1 osw.close();// 2 fos.close();// 3 1の中で2が呼ばれているので、 正常に実行されるとOutputStreamWriter#closeが2回呼ばれている事になります。 …もしかするとFileOutputStreamだけでもclose呼んだ方が良いかも知れません 二重に開放する事で別の問題が生じるかもしれませんが…

percy6081
質問者

お礼

>正常に実行されるとOutputStreamWriter#closeが2回呼ばれている事になります。 そうなんですよね。でも一応正常に動いているので、ダイジョブなのかなぁと考えてしまっているんですが。 >FileOutputStreamだけでもclose呼んだ方が良いかも知れません そうしてしまえばまあ確実ですよね。

関連するQ&A