Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのBufferedWriterクラスにおけるflush()メソッドの目的とは?使い方を徹底解説

JavaでBufferedWriterオブジェクトを使ってストリームにデータを書き込む場合、write()メソッドを呼び出した時点では、データはまず内部のバッファに一時的に保存されるだけで、実際にはまだ何も出力されません。

flush()メソッドは、このバッファに溜められた内容を、基となるストリームへ強制的に押し出す(書き出す)ために使用します。

なぜバッファリングが必要なのか

そもそもBufferedWriterがデータを直接ストリームに書き込まず、一度バッファに蓄えるのは、ディスクやネットワークなどへのアクセス回数を減らし、書き込み処理のパフォーマンスを向上させるためです。ある程度データが溜まった時点でまとめて書き出すことで、処理効率が大きく改善されます。

その一方で、プログラム終了前や即座に出力が必要なタイミングでは、バッファの内容を明示的に吐き出す必要があります。これを行うのがflush()メソッドです。

flush()を呼び出さない場合の例

次のJavaプログラムでは、コンソール(標準出力ストリーム)に1行のテキストを出力しようとしています。ここでは、出力したい文字列を引数として渡し、write()メソッドを呼び出しています。

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class BufferedWriterExample {
    public static void main(String args[]) throws IOException {
        // OutputStreamWriterクラスのインスタンス化
        OutputStreamWriter out = new OutputStreamWriter(System.out);
        // BufferedWriterのインスタンス化
        BufferedWriter writer = new BufferedWriter(out);
        // コンソールへデータを書き込む
        writer.write("Hello welcome to Tutorialspoint");
    }
}

しかし、このコードではBufferedWriterのバッファ内容をフラッシュしていないため、実行してもコンソールには何も表示されません。

flush()を使って解決する方法

この問題を解決するには、write()メソッドの実行後にflush()メソッドを呼び出します。そうすることで、バッファ内のデータが標準出力ストリームへ書き出され、コンソールに文字列が表示されます。

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class BufferedWriterExample {
    public static void main(String args[]) throws IOException {
        // OutputStreamWriterクラスのインスタンス化
        OutputStreamWriter out = new OutputStreamWriter(System.out);
        // BufferedWriterのインスタンス化
        BufferedWriter writer = new BufferedWriter(out);
        // コンソールへデータを書き込む
        writer.write("Hello welcome to Tutorialspoint");
        // バッファの内容を強制的に書き出す
        writer.flush();
    }
}

実行結果

Hello welcome to Tutorialspoint

補足:close()メソッドとの関係

なお、close()メソッドを呼び出すと、ストリームを閉じる前に自動的にバッファがフラッシュされます。そのため、プログラムの最後でストリームを閉じる場合は、明示的にflush()を呼ばなくてもデータは出力されます。ただし、close()を呼ぶとそれ以降そのライターは使用できなくなるため、途中経過の出力が必要な場面ではflush()が活躍します。

  1. JavaのContainerクラスとは?重要性と使い方を実例つきで解説

    JavaのGUIプログラミングにおいて、Containerクラスは画面を構成する部品を整理・管理するための土台となる存在です。この記事では、Containerクラスの役割、種類ごとの特徴、そして実際のコード例を通じて、その重要性をわかりやすく解説します。 Containerクラスとは Containerクラスは、複数のコンポーネント(ボタンやテキストフィールドなど)をひとまとめにして保持できる特殊なコンポーネントです。UIを構築する際の「入れ物」として機能し、レイアウト管理においても重要な役割を担います。 Containerクラスは、複数のコンポーネントの集まりを保持できる特殊なコンポー

  2. JavaのCardLayoutクラスとは?その重要性と基本的な使い方をわかりやすく解説

    CardLayoutは、コンポーネントをカードのように順番に重ねて配置するレイアウトマネージャーです。このレイアウトでは、一度に表示されるコンポーネントは1つだけであり、追加された各コンポーネントがそれぞれ1枚の「カード」として扱われます。CardLayoutの特徴CardLayoutは、他の一般的なレイアウトマネージャーとは大きく異なります。通常のレイアウトマネージャーはコンテナ内のすべてのコンポーネントを同時に表示しようとしますが、CardLayoutは常に1つのコンポーネントのみを表示します。CardLayoutでは、カード(コンポーネント)は通常JPanelなどのコンテナに配置されます