
Javaを独習Javaで独習しています。現在、入出力の所まできたのですが、Writerクラスのclose()とflush()の違いがわかりません。それぞれのメソッドの意味はわかるのですがそれらを使う目的がわかりません。flush()は「バッファ付けデータをそのストリームで表されている物理デバイスに書き込む」とあるのですが、サンプルには(バッファ付け文字ストリームの単元にも)flush()は一度も出てこずclose()のみで書き込みが行われています。探したのですが独習Javaのサンプルの中には結局flush()は一度も出てきませんでした。この二つの違いはなんなのでしょうか?初心者のためわかりにくい質問かとは思いますがよろしくお願いします。
No.2ベストアンサー
- 回答日時:
フラッシュすれば、ファイルやその他物理デバイスに強制的にバッファの内容が出力されるということは、理解されていると考えてよいですね?
で、なかなかストリームをクローズできない(またはしない)場合には、いつまで経ってもバッファの内容が物理デバイスに出力されないかも知れませんよね?でも、適当なタイミングで定期的にフラッシュすれば、その時点でバッファに溜まっている内容が物理デバイスに出力されます。
そのサンプルの場合は、書き出してすぐ?クローズしちゃうため、明示的なフラッシュは必要なかったんだと思いますが、
・フラッシュは、(ストリームを閉じずに)バッファの内容を強制的に物理デバイスに出力する。
・クローズは、(フラッシュされていなければフラッシュしてから)そのストリームを閉じる。
とまぁ、目的も内容も全然違うわけです。
回答ありがとうございます。サンプルのような小さなプログラムではflush()する必要はないということですね?ありがとうございました。
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 …
図を使ってのわかりやすい回答ありがとうございます。自分が今、勉強している程度のプログラムではflush()は必要ないのだとわかりました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
Winmerge ファイルの中身は同じなのに黄色くなる
その他(OS)
-
リクエストに応じたselectedの初期値設定方法
Java
-
System.err. printlnとSystem.out.printlnはどう違うんでしょうか?
Java
-
-
4
csv出力について
Java
-
5
DB2で SQL1032N start database managerエラー
その他(データベース)
-
6
[JAVA]try 内の変数を外で!?
Java
-
7
Eclipseで、プロジェクト名のところに赤いバッテンのエラーマークが
Java
-
8
jspからjavascriptの変数引継ぎ
JavaScript
-
9
データを削除しても表領域の使用率が減りません
Oracle
-
10
ワイルドカード<?>と型パラメータ<T>の違いがすっきりしない。
Java
-
11
close()で例外が投げられる理由
Java
-
12
エスケープ文字の復帰(¥r)とはなんですか?
Java
-
13
newしないインスタンス?実体化しなくてもいいの?
Java
-
14
Javascriptの値をJava(JSP)へ渡す方法
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
System.out.printlnの出力先
-
Log4jで機能毎に別ファイルへ出...
-
system.out.printが出力されない
-
テキストエリアで改行する
-
flush()とclose()について
-
条件分岐が多いIF分の書き方に...
-
一定のスペースを空けて端を揃...
-
1を0001として出力する処理
-
java for文、if文を使っての三角形
-
StrutsでJSPからListを受け取り...
-
JSPやサーブレットでSystem.out...
-
eclipseに記述したjavaファイル...
-
javaで判別式のプログラミング...
-
JSPでImportエラーになります
-
EclipseでJava
-
プログラミングの問題です。大...
-
Java Struts ~に対するゲッタ...
-
九九を横に表示する。
-
C# ListBoxのインデックスの値...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
flush()とclose()について
-
Javaで改行などが出来ないのです。
-
一定のスペースを空けて端を揃...
-
1~100までの数字を表示し、か...
-
Log4jで機能毎に別ファイルへ出...
-
System.out.printlnの出力先
-
system.out.printが出力されない
-
System.out.printlnの意味がよ...
-
1~100までの数字を表示したい
-
Tomcatが無応答となる現象が起...
-
InputStreamはreadが1回しかで...
-
switch分が機能しません。
-
tomcatのstdout.logを停止したい。
-
OpenSSL関数エラーについて
-
JAVAのServletで、画像表示につ...
-
Eclipseのコンソールを常に表示...
-
テキストエリアで改行する
-
Log4Jではログを改行できない?
-
ファイル書き込みに関して
おすすめ情報