• ベストアンサー

flush()とclose()について

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

  • aleck
  • お礼率85% (40/47)
  • Java
  • 回答数2
  • ありがとう数14

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

  • ベストアンサー
  • 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

  • Javaのコネクションやストリームについて

    Javaのコネクションやストリームを別クラスやメソッドに渡したときの、close処理について質問です。 例えば、あるクラスで取得したDBコネクションオブジェクトを、別のクラスやメソッドに渡した場合、close処理はどこで行うのが適切でしょうか? 呼び出し元で行うのが良いのか、呼び出し先で行うのが良いのか、または、両方で行うべきなのか。 どなたかご教授願います。

    • ベストアンサー
    • Java
  • close()で例外が投げられる理由

    最近、Java を勉強しはじめておるのですが、ファイル入出力処理で例えば、out.txt なるファイルを出力するサンプルとして FileWriter out = null; try {  wt = new FileWriter("out.txt");  out.write("はろー"); } catch ( IOException e ) {  e.printStackTrace(); } finally {  try {   if (out != null ) out.close();  } catch (IOException e) {   e.printStackTrace();  } } という風に、FileWriter オブジェクト out をクローズする時に IOException 例外が投げられる可能性に対処するため、try / catch でこれをつかまえるように、と聞きました。 そして驚くべきことに、close() が例外を投げた時の catch 節には特に書くべき処理はない、というのです。 そこで質問です。 1. 本当に FileWriter#close() の IOException 例外に対処するためのコードは不要なのですか?(常に握り潰しているだけ?) 2. 対処するコードが不要なら、そもそも FileWriter#close() が IOException 例外を投げる必要がないのではないですか? 長文失礼しました。

  • 「IOException は対応する try 文の本体ではスローされません。」というエラー。

    次のようなクラスを作成したのですが、表題のようなエラーが出てしまいます。 PrintWriterクラスのcloseメソッドは、 Closableインターフェースのcloseと witerクラスのcloseと同じ定義だと考えていたので、きっとIOExceptionが発生すると考えていたのですが・・・違うのでしょうか? Finallyの中にtryを書くと何か問題が起こるのでしょうか? ソースをそのまま書くのは気が引けるのですが、どうか教えて頂けないでしょうか? /** * ファイルに文字を書き込むクラス */ class Sample { PrintWriter writer; //書き込むためのクラス public void writerTest() { try { //** テストファイルに書き込み */ writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream("sample.txt",false),"EUC-JP"))); //書き込みを行います writer.println("A"); writer.flush(); } catch(IOException ioe) { System.out.println(ioe.getMessage()); } finally { try { writer.close(); } catch(IOException ioe) //このcatchでエラーが発生します。 { System.out.println(ioe.getMessage()); } } } }

    • ベストアンサー
    • Java
  • ファイル操作時のclose処理の失敗とは?

    ファイル操作時のclose処理の失敗とは? とりあえず具体的な例を挙げますとFileOutputStreamのclose時。 このときに発生する例外とはどんなケースだろう、 例外が発生したときにはどんな対処をすべきだろうと考えましたが、 発生しうるケースが分かりませんでしたし、 catchに記述すべき処理がわかりませんでした。 JavaDocには以下のように記述されています。 「IOException - 入出力エラーが発生した場合」 意味が分かりません…。考えるのが面倒なので手抜を抜いた感があります。 FileOutputStream (Java 2 プラットフォーム SE v1.4.0) http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/io/FileOutputStream.html FileOutputStream (Java 2 Platform SE 5.0) http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/io/FileOutputStream.html FileOutputStream (Java Platform SE 6) http://java.sun.com/javase/ja/6/docs/ja/api/java/io/FileOutputStream.html バッファ書込みをするクラスの場合には、ディスクの容量が足りなくて close処理時に書込みが失敗して例外発生、ということは 十分にありうると思います。しかしFileOutputStreamでは関係ありません。 デバッガで、途中で処理を止めclose前に処理を終了させてしまっても 問題は生じませんでした(WindowsXP上では)。 質問は以下です。 ・ファイル出力処理のclose時に例外が発生するのはどのような環境・ケースか ・例外が発生した場合にはどんな処理をすべきか(ログ出力以外で) よろしくお願いします。

    • ベストアンサー
    • Java
  • includeアクションのflush属性について

    質問があります。 現在JSP/サーブレットを学習中なのですが、どうしてもわからないことがあります。それは、includeアクションのflush属性についてなのですが、flush属性にtrueやfalseのどちらを設定しても、結果画面にその違いが反映されていなくてflush属性の役割が理解できません。まずは、 以下のサンプルをご覧ください。 ----------------------------------------------------- <%@ page contentType="text/html;charset=Shift_JIS" %> <html> <head> <title>include_action.jsp</title> </head> <body> <p>表示1</p> <jsp:include page="/morej/foo.jsp" flush="true"/> <p>表示2</p> </body> </html> ----------------------------------------------------- <%@ page contentType="text/html;charset=Shift_JIS" %> <html> <head> <title>foo.jsp</title> </head> <body> <p>こんにちは</p> </body> </html> ------------------------------------------------------------ 参考書には、flush属性は「インクルード前にレスポンスバッファを クリアするかどうかの指定。trueを指定した場合はクリアする。」 と記述されています。上記のサンプルの結果画面は -------------------------------------------------- 表示1 こんにちは 表示2 -------------------------------------------------- と表示されます。flush属性をtrueに設定すると、 インクルード前に出力バッファをクリアすると記述されているので、 「表示1」が表示されないことを期待したのですが、表示されてしまいます。もしかしたら、自分の認識が間違っているかもしれないので どなたか、flush属性の使い方を教えていただけませんでしょうか。 現在の環境は、windows vista home、jdk1.6.0_11、jre1.6.0、 Apache Tomcat/6.0.14、Eclipse Version: 3.4.1です。では、 よろしくお願いします。

    • ベストアンサー
    • Java
  • Javaのメソッドについて

    Javaの参考書を見ていて分からない点があります。 sampleクラスで使用したcurrentThreadメソッドは、 Thread.currentThread()と書いてもcurrentThread()と書いても 実行結果が同じになります。 Thread.と書かれた状態とThread.が書かれてない状態の違いはいったいなんでしょうか。 よろしくお願いいたします。

  • 最終配列にNULLが含まれる場合の対応について

    下記のソースで テキスト入出力を行う際でのご質問がございます。 最終配列がNULLの時と 文字がある場合のデータを入出力する際に Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 at ExIO3.getValue(テスト.java:53) at ExIO3.main(テスト.java:14) というエラーが表示されます。 最終配列にすべて文字が存在する場合は問題ないのですが こちらはBufferedReaderで 1レコードずつ読み込んでいるソースに問題があるのでしょうか? アドバイスどうぞよろしくお願いします。 import java.io.*; //(1)入出力パッケージのインポート import java.text.Normalizer; class ExIO3 { //mainメソッド public static void main(String[] args) throws IOException { ExIO3 object1 = new ExIO3(); //(1)抜出しメソッドgetValueと、 // ソートメソッドsortValueの呼出 object1.sortValue(object1.getValue()); } //getValueメソッド Reader getValue () throws IOException { //(2)FileReaderオブジェクトcsvの生成 FileReader csv = new FileReader ("C:\\javasample\\テスト\\src\\テストin.txt"); //(3)BufferedReaderクラスでFileReaderクラスの // オブジェクトcsvをラップ BufferedReader in = new BufferedReader(csv); //(4)PipedWriterオブジェクトpipeOutを生成 PipedWriter pipeOut = new PipedWriter(); //(5)PipedReaderオブジェクトpipeInを生成 PipedReader pipeIn = new PipedReader(pipeOut); //(6)PrintWriterクラスでPipedWriterクラスの // オブジェクトpipeOutをラップ PrintWriter out = new PrintWriter("C:\\javasample\\テスト\\src\\テストout.txt"); //************************************************************************************************ //(7)入力テキストデータ //************************************************************************************************ String line; String[] arrayline; Integer sequence_No =0 ; //行のカウンタ //(8)読み込みソースがなくなるまでBufferedReaderで1行ずつ読み込み、 // 読み込みデータをprintlnメソッドで書き込み while((line = in.readLine()) != null) { sequence_No++; //連続番号生成 arrayline = line.split(","); //====================================================== String A= arrayline[0] ; String B = arrayline[1] ; //====================================================== //************************************************************************************************ //(9)出力テキストデータ //************************************************************************************************ 顧客郵便番号_編集(A,out); out.print(","); // ※ 顧客住所_編集(B,out); out.println(""); // ※ out.flush(); } //(10)読み込みストリームのクローズ in.close(); //(11)書き込みストリームのクローズ out.close(); return pipeIn; //(12)pipeInオブジェクトのリターン } //************************************************************************************************ //顧客郵便番号_編集A1 //************************************************************************************************ private void 顧客郵便番号_編集(String a, PrintWriter out) { // TODO 自動生成されたメソッド・スタブ out.print(a.replaceAll(" ","").replaceAll(" ","")); } //************************************************************************************************ //顧客住所_編集B2 //************************************************************************************************ private void 顧客住所_編集(String b, PrintWriter out) { // TODO 自動生成されたメソッド・スタブ out.print(b); } //sortValueメソッド void sortValue(Reader source) throws IOException { } }

    • ベストアンサー
    • Java
  • プログラムのしくみ??

    FLASHやJavaアプレットで「びよよよ~~ん」と バネやゴムが伸縮するような動きをするグラフィックや じわじわとスピードを落としながら動きが止まるグラフィックがありますが、あーゆーものは物理の公式をプログラムにおきかえているのですか? もしそうだとしたらプログラムの為の物理公式集とかあるのでしょうか? おすすめの本、HP等あったら教えて下さい。 ちなみに物理関係のHPいろいろ見ましたが、どうプログラムに置き換えて よいやらさっぱりわかりませんでした。 以前「サンプルコードをコピペすればよい」とか言われたことがあるの ですが、理屈がわからないとどうしても気持ちが悪いので・・・ どなたかアドバイスお願いします。

  • docomo60秒タイムアウトで困っています。開発・携帯・iアプリ・JAVA

    現在docomoのiappliをjavaで開発しています。 サーバはsevlet、クライアントはDoja(jam)です。 あるデータをクライアントからサーバに問い合わせ、クライアントに返すようなものを作っているのですが、何をしても携帯側が1分(60秒)でタイムアウトしてしまいます。 ストリーム形式とかバッファー形式でデータをflushして携帯に適当なデータを送りつけているのですがだめでした。 ちなみに、TCPダンプやtomcatのログをみてもデータ通信ができていません。 携帯側に設定があるのではないかと(ADFを)調べましたができそうにありませんでした。 もし同じような問題で悩んだとか、解決したというような人はいませんでしょうか。 宜しくお願い致します。

  • 処理方法について

    こんにちは。 独学でjavaの勉強をしているのですが、 演習問題で分からないところがあります。 ファイルへの書き込みをする問題なのですが、 public void kakikomi(){ try { FileOutputStream out=new FileOutputStream("output.txt"); PrintWriter writer=new PrintWriter(out); writer.println(seibetu); writer.println(nenrei);   writer.println(taijuu); writer.println(sintyou); writer.flush(); writer.close(); }catch (FileNotFoundException e) {} } mainよりオブジェクトを作成しそれぞれの変数に(seibetu,nenrei...)値を入れファイルへ書き込みをするプログラムです。 上記のプログラムの場合性別を入れファイルを閉じる、身長を入れファイルを閉じるという作業をしているため 結果的に最後の項目である身長の値のみしかファイルに書き込み 出来ません。 どのようにすれば全ての項目をファイルに書き込むことが出来るでしょうか? よろしくお願いします。

専門家に質問してみよう