アプリ版:「スタンプのみでお礼する」機能のリリースについて

ファイル出力に関して、次のようなコードをよく目にします。

例外処理省略
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されるのでしょうか?

A 回答 (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呼んだ方が良いかも知れません
二重に開放する事で別の問題が生じるかもしれませんが…
    • good
    • 0
この回答へのお礼

>正常に実行されるとOutputStreamWriter#closeが2回呼ばれている事になります。

そうなんですよね。でも一応正常に動いているので、ダイジョブなのかなぁと考えてしまっているんですが。

>FileOutputStreamだけでもclose呼んだ方が良いかも知れません

そうしてしまえばまあ確実ですよね。

お礼日時:2008/08/21 18:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!