• ベストアンサー

flush()とclose()について

Javaを独習Javaで独習しています。現在、入出力の所まできたのですが、Writerクラスのclose()とflush()の違いがわかりません。それぞれのメソッドの意味はわかるのですがそれらを使う目的がわかりません。flush()は「バッファ付けデータをそのストリームで表されている物理デバイスに書き込む」とあるのですが、サンプルには(バッファ付け文字ストリームの単元にも)flush()は一度も出てこずclose()のみで書き込みが行われています。探したのですが独習Javaのサンプルの中には結局flush()は一度も出てきませんでした。この二つの違いはなんなのでしょうか?初心者のためわかりにくい質問かとは思いますがよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mid_kazwo
  • ベストアンサー率57% (188/326)
回答No.2

フラッシュすれば、ファイルやその他物理デバイスに強制的にバッファの内容が出力されるということは、理解されていると考えてよいですね? で、なかなかストリームをクローズできない(またはしない)場合には、いつまで経ってもバッファの内容が物理デバイスに出力されないかも知れませんよね?でも、適当なタイミングで定期的にフラッシュすれば、その時点でバッファに溜まっている内容が物理デバイスに出力されます。 そのサンプルの場合は、書き出してすぐ?クローズしちゃうため、明示的なフラッシュは必要なかったんだと思いますが、 ・フラッシュは、(ストリームを閉じずに)バッファの内容を強制的に物理デバイスに出力する。 ・クローズは、(フラッシュされていなければフラッシュしてから)そのストリームを閉じる。 とまぁ、目的も内容も全然違うわけです。

aleck
質問者

お礼

回答ありがとうございます。サンプルのような小さなプログラムではflush()する必要はないということですね?ありがとうございました。

その他の回答 (1)

  • aton
  • ベストアンサー率47% (160/334)
回答No.1

一言でいうと,flush()は何度でも実行できるけど,close()は(当該Writerインスタンスに対して)1回しか実行できない,という違いがあります。 また,flush()を実行した後でもwrite()を使って書きこみを行うことができますが,close()の実行後にwrite()を行おうとするとIOExceptionがスローされます。 flush()は単に内部バッファにたまっているデータを出力先に書き出す処理で,close()は内部バッファにたまっているデータを出力先に書き出した後,内部バッファと出力先を閉じてそれ以上書込を受け付けないようにする処理です。 内部バッファ:■■■■■ 出力先   :~ ↓ flush(); ↓ 内部バッファ: 出力先   :~■■■■■ ↓ write("■■■"); ↓ 内部バッファ:■■■ 出力先   :~■■■■■ ↓ close() ↓ 内部バッファ:<書込不可> 出力先   :~■■■■■■■■<書込不可> イメージとしてはこんな感じだと思います。

参考URL:
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/io/Writer.html
aleck
質問者

お礼

図を使ってのわかりやすい回答ありがとうございます。自分が今、勉強している程度のプログラムではflush()は必要ないのだとわかりました。ありがとうございました。

関連するQ&A