様々なクラス③:PrintWriterクラス

便利な書き込み用クラスについて説明します。print/println/printfメソッド、flush、自動flush処理を確認します。

クラス 1 2 3 4 5 6 7

様々なクラス③:PrintWriterクラス

PrintWriterクラス

PrintWriterとは

PrintWriterクラスは、書き込みに特化したクラスです。System.out.println()で使い慣れたprint()println()メソッドが使える他、書式付き出力を行うprintf()メソッドも備えています。BufferedWriterをラップして使うことで、効率的なファイル書き込みができます。

サンプルプログラム

ClassSample1.java
package class3;
import java.io.*;
public class ClassSample1 {
    public static void main(String[] args) {
        PrintWriter pw = null;
        try {
            pw = new PrintWriter(new BufferedWriter(new FileWriter("test.txt")));
        } catch (IOException e) {
            e.printStackTrace();
        }
        pw.print("printによる出力(改行なし):");
        pw.println("printlnによる出力(改行あり)");
        pw.printf("printfによる出力 %s",5);
        System.out.println("Data Writing Finished.");
        pw.close();
    }
}
Data Writing Finished.

コンソールには「Data Writing Finished.」のみ表示されます。print/println/printfの出力はtest.txtに書き込まれます。(図3-1)

test.txtの中身

図3-1:test.txtの中身

PrintWriterクラスとflush()

flush()による確実な書き込み

PrintWriterにはバッファがあるため、flush()を呼ばないとデータがファイルに書き出されない場合があります。

ClassSample2.java
package class3;
import java.io.*;
public class ClassSample2 {
    public static void main(String[] args) {
        PrintWriter pw = null;
        try {
            pw = new PrintWriter(new BufferedWriter(new FileWriter("test2.txt")));
        } catch (IOException e) {
            e.printStackTrace();
        }
        pw.println("Line1");
        pw.println("Line2");
        pw.flush();
        System.out.println("Data Writing Finished.");
        //pw.close();
    }
}
Data Writing Finished.

close()をコメントアウトしていますが、flush()を呼んでいるためLine1・Line2はファイルに書き出されます。(図3-2)

test2.txtの中身

図3-2:test2.txtの中身

PrintWriterクラスの自動flush処理

コンストラクタで自動flushを有効にする

PrintWriterのコンストラクタの第2引数にtrueを指定すると、println()が呼ばれるたびに自動的にflush()が実行されます。

自動flush処理の設定
pw = new PrintWriter(new BufferedWriter(new FileWriter("test.txt")), true);

この設定を行うと、flush()を明示的に呼び出さなくてもprintln()の都度データがファイルに書き出されます。