
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で質問しましょう!
似たような質問が見つかりました
- 英語 英語の「Asian flush」という言葉の意味について 1 2022/07/22 17:12
- 英語 The implant was placed to be flush with the crest 3 2022/04/30 00:48
- その他(海外) 海外留学の経験がある方や、英語圏の文化に詳しい方に伺いたいことがあります。 1 2022/06/28 10:39
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- JavaScript Python Java,Springフレームワークの習得 1 2023/08/02 15:28
- Java Javaについて質問です。 勉強し始めたばかりの初心者です。 相続税について課税額を算出するコードを 1 2022/05/31 19:02
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- その他(ゲーム) マインクラフトJAVA版の導入・ローカルマルチプレイについて 1 2022/03/23 18:59
このQ&Aを見た人はこんなQ&Aも見ています
-
Winmerge ファイルの中身は同じなのに黄色くなる
その他(OS)
-
csv出力について
Java
-
DB2で SQL1032N start database managerエラー
その他(データベース)
-
-
4
[JAVA]try 内の変数を外で!?
Java
-
5
Junitテストでvoid戻り値メッソドをテストする方法
Java
-
6
ワイルドカード<?>と型パラメータ<T>の違いがすっきりしない。
Java
-
7
close()で例外が投げられる理由
Java
-
8
Eclipseで、プロジェクト名のところに赤いバッテンのエラーマークが
Java
-
9
リクエストに応じたselectedの初期値設定方法
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
1~100までの数字を表示したい
-
一定のスペースを空けて端を揃...
-
Javaで改行などが出来ないのです。
-
1~100までの数字を表示し、か...
-
flush()とclose()について
-
system.out.printが出力されない
-
OpenSSL関数エラーについて
-
switch分が機能しません。
-
Tomcatが無応答となる現象が起...
-
Log4jで機能毎に別ファイルへ出...
-
JavaScriptを使ってロト6の当...
-
出力する桁数
-
テキストエリアで改行する
-
System.out.printlnの出力先
-
InputStreamはreadが1回しかで...
-
tomcatのstdout.logを停止したい。
-
半角カナが含まれる文字列をフ...
-
POIでExcelに時刻(h:mm)の値を...
-
サーブレットで入力エラー時に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
System.out.printlnの出力先
-
flush()とclose()について
-
Log4jで機能毎に別ファイルへ出...
-
system.out.printが出力されない
-
Javaで改行などが出来ないのです。
-
Tomcatが無応答となる現象が起...
-
1~100までの数字を表示したい
-
一定のスペースを空けて端を揃...
-
InputStreamはreadが1回しかで...
-
Log4Jではログを改行できない?
-
Eclipseのコンソールを常に表示...
-
1~100までの数字を表示し、か...
-
switch分が機能しません。
-
数字文字列をパック10進数に変...
-
javaにおけるCSV出力時の文字コ...
-
tomcatのstdout.logを停止したい。
-
Java 九九の表について
-
VBSエラー"オブジェクト型の変...
-
Java swing エクセル書き込み
おすすめ情報