Writer型

Writer型の利用方法

出力を扱うWriterを利用する方法を確認しましょう.Writer型もReader型と同じく, 多くの型が存在します.典型的な型を次に紹介します.

ここに挙げた以外にもいくつかのWriter型が存在しますが,この講義では,FileWriterPrintWriter の2つの型のみを利用します.

典型的なファイルへのデータの書き込み方法.

void writeWithWriter(File file, String message) throws IOException{
    PrintWriter out = new PrintWriter(new FileWriter(file)); // (2)
    // 上記の(2)の処理を区別して書くと次のような処理になる.
    //     FileWriter fwriter = new FileWriter(file);
    //     PrintWriter out = new PrintWriter(fwriter);
    out.print(message);
    out.close();
}

ファイルに文字列(String型の変数message)を書き込む方法は上記の通りです. まず,FileWriterを利用してファイルに書き込むためのWriter型を構築します. 次に,構築したFileWriterPrintWriterに渡し,文字列の出力が 可能なPrintWriterを構築します.

そして,文字列をファイルに書き込むには,PrintWriter型の変数outに対してprintメソッドを呼び出して,文字列を書き込んでいます. 他に,printlnprintfメソッドも用意されています.

最後に,これ以上ストリームを利用しないため,closeメソッドを呼び出しています.closeメソッドを 呼び出すと,ラップされているFileWriterも閉じられます.

読み込み時と同じように,IOExceptionの例外に対応しなければいけません. ここでも同じように,writeWithWriterを呼び出しているメソッドに責任を転嫁するため,throws節 でIOException を投げると宣言しましょう.

1文字単位で書き込む場合は,Writer型のwriteメソッドを利用してください.write メソッドにInteger型の値を渡せば適切な出力先に書き込まれます. 1文字単位の読み込みで取得した Integer型の値を渡すのが典型的な使い方でしょう.

例題2. 指定された行数を出力するコマンド

ここでは,ファイルに値を書き出してみましょう. クラス名をOutputNとし, コマンドライン引数で数字とファイル名を受け取ってください. コマンドライン引数で受け取った数字を1から順にカウントアップして指定行数を指定されたファイルに出力してください.

実行例

$ ls             # 出力ファイルがないことを確認する.
OutputN.java      OutputN.class
$ java OutputN 3 file3.txt # file3.txt に書き込む.
$ ls             # file3.txt が作成されたことを確認する.
OutputN.java      OutputN.class        file3.txt
$ cat file3.txt  # file3.txt の内容を確認する.
1
n2
3
$ java OutputN 10 file10.txt # file10.txt に書き込む.
$ ls             # 新たに file10.txt が作成されたことを確認する.
OutputN.java      OutputN.class        file3.txt      file10.txt
$ cat file10.txt # file10.txt の内容を確認する.
1
2
...途中省略
9
10
例題2の解答例

例題3. 単純なファイルコピー

ここでは,引数に与えられたファイルの内容を output というファイルにコピーして見ましょう. クラス名は SimpleCopier とし,コマンドライン引数で1つのファイル名を受け取ってください.

コマンドライン引数で受け取ったファイルをFileReaderを用いて開き, 出力先の output ファイルもFileWriterで開きましょう. 次に,読み込み元から1文字読み込み,出力先に1文字書き出す処理を読み込み元からデータが読み込めなくなるまで繰り返しましょう.

実行例

$ ls
SimpleCopier.java     SimpleCopier.class
$ java SimpleCopier SimpleCopier.java # SimpleCopier.java を output にコピーする.
$ ls
output                SimpleCopier.java     SimpleCopier.class
$ diff output SimpleCopier.java # 2つのファイルの違いを確認するコマンド
$ # 何も違いがないので,何も出力されない.
例題3の解答例