ただ日々を記すもの

意識高めを装うことができます

FileWriterクラスのflushメソッドの意味について

ファイルへの入出力の勉強を改めてしていて、え、これどーゆーことだってのがあったのでここに書いておきます。

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
ファイルへの書き込み