PrintWriterクラス

書き込みに特化したクラス

続いて、書き込みに特化したクラスである、PrintWriterクラスについて説明します。print()メソッドやprintln()メソッド、更にprintf()メソッドとformat()メソッドも実装しているクラスで、これらのメソッドを今までコンソールへの出力と同じように用いてファイルに出力できるというクラスです。

このクラスの記述方法は、BufferedWriterをラップする形で記述します。では実際に、PrintWriterクラスのサンプルを見てみましょう。

ClassSample1.java
package class3;

import java.io.*;

public class ClassSample1 {

    public static void main(String[] args) {
		PrintWriter pw = null;
		//FileWriterオブジェクトを生成する際にIOExceptionがスローされる可能性がある
		try {
			//PrintWriterクラスでラップしてコマンドライン引数でファイルを指定
			pw = new PrintWriter(new BufferedWriter(new FileWriter("test.txt")));
		} catch (IOException e) {
			e.printStackTrace();
		}
		pw.print("printによる出力(改行なし):");		//print()メソッドで出力
		pw.println("printlnによる出力(改行あり)");		//println()メソッドで出力
		pw.printf("printfによる出力 %s",5);				//printf()メソッドで出力
		System.out.println("Data Writing Finished.");

		pw.close();
    }

}

このプログラムを実行すると、「」というファイルが生成されて、内容は以下のようになります。(図3-1.)

図3-1.test.txtの中身

test.txtの中身

まず、PrintWriterクラスでBufferedWriterクラスおよびFileWriterクラスのオブジェクトをラップしています。ファイル名を実行例では“test.txt”を指定しています。この部分で検査例外IOExceptionがスローされる可能性があるのでtry~catchで例外処理を施してしています。

そのあとで、print()メソッド、println()メソッド、printf()メソッドを利用してファイルに書き込みを行っています。ここでの結果は、「System.out.~」と記述した場合と同様です。print()では改行なし、println()では改行あり、そして、printf()では、%sなどの記号が使えます。

これにより、コンソール画面に文字列を表示するような感覚でファイルに文字を書き込むことができます。最後の方でclose()メソッドを呼び出してクローズしています。ファイルのクローズと同時に、flush()処理が行われ、最終的にファイルにデータが書き込まれます。

PrintWriterクラスとflush()

また、PrintWriterクラスには、flush()メソッドがあり、ファイルをクローズする前にデータをファイルに実際に書き込むことができるようになっています。以下のサンプルを実行してみましょう。

ClassSample2.java
package class3;

import java.io.*;

public class ClassSample2 {

    public static void main(String[] args) {
		PrintWriter pw = null;
		//FileWriterオブジェクトを生成する際にIOExceptionがスローされる可能性がある
		try {
			//PrintWriterクラスでラップしてコマンドライン引数でファイルを指定
			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();
    }

}

このプログラムを実行すると、「test2.txt」というファイルが生成されて、内容は以下のようになります。(図3-2.)

図3-2.test2.txtの中身
test2.txtの中身

この結果からわかるとおり、最終行の、close()処理がコメントされているのにもかかわらず、ファイルにテキストが書き込まれています。つまり、flush()メソッドを呼び出すことにより、ファイルをクローズする前にデータを書き込むことができるのです。

PrintWriterクラスの自動flush処理

PrintWriterクラスのおかげで、コンソールに文字を出力するような感覚で簡単にファイルへの書き込みが行えるようになりました。しかし、flush()処理が行われるのは、明示的にflush()メソッドを呼び出したときか、close()処理が行われてからです。しかし、かなり大きなデータを書き込みながら処理を行う際には、いささか面倒です。

書き込みと同時にflush()処理を行うようにすることはできないのでしょうか?実は、オブジェクト生成時の第2パラメーターに「true」を指定しておくと終了時にflush()機能が働きます。このため、クローズ処理は明記しなくてもファイルに書き出されます。

自動的にflush()を行うPrintWriterオブジェクトの生成例
pw = new PrintWriter(new BufferedWriter(new FileWriter("test.txt")),true);

このようにtrueを指定すると、自動的にflush処理が行われます。これによりクローズ処理は明記しなくてもファイルに書き出されますが、気をつけなくてはならないのが、ファイルに書き込まれてもメモリー上に残ってしまうことです。そのため、必ずclose()メソッドの記述を忘れないようにしましょう。