ファイルへの入出力の勉強を改めてしていて、え、これどーゆーことだってのがあったのでここに書いておきます。
FileWriterクラスのメソッドの説明
あるテキストにFileWiterクラスのwrite,flushメソッドの説明として、以下のように書かれていました。
- write
引数で指定された文字列を書き出す。
- flush
目的の送信先に、直ちに文字を書き出す。
一見するとflushメソッドって意味あるの?と感じて使用目的がつかめませんでした。
自身でコードを書いて挙動を確かめることでなんとか解決。
public class Sample { public static void main(String[] args) { try (FileWriter fw = new FileWriter(new File("a.txt")); FileReader fr = new FileReader(new File("a.txt"))) { fw.write("サンプル"); // fw.flush(); int i = 0; while((i = fr.read()) != -1) { System.out.print((char)i); } } catch(IOException e) {} } }
上のコードをコメントアウトを外して実行すると、実行結果は、
サンプル
となります。
次にコメントアウトし、実行すると、
なにも表示されません。
なるほど。flushメソッドで、文字の書き込みが行われるのか!
と思ってa.txtファイルを見てみると、サンプルという文字が書き込まれていました。
...あれ?
これってどういうこと?
closeメソッドの暗黙的な処理
ここで、ちょっと調べてみると、どうやらFileWriterのcloseメソッドが呼ばれたタイミングで、
自動的にflushメソッドも実行されるらしい。
ってことで、コードを少し書き換えて再び実行!!
public class Sample { public static void main(String[] args) { try (FileWriter fw = new FileWriter(new File("a.txt")); FileReader fr = new FileReader(new File("a.txt"))) { fw.write("サンプル"); // fw.flush(); fw.close(); int i = 0; while((i = fr.read()) != -1) { System.out.println((char)i); } } catch(IOException e) {} } }
これだと、a.txtにも書き込まれ、実行結果も
サンプル
となりました。
まとめ
FileWriterクラスのwriteメソッドとflushメソッドの役割は、
- write
ファイルバッファへの書き込み
- flush
ファイルへの書き込み