Writer型
Writer 型の利用方法
出力を扱うWriterを利用する方法を確認しましょう.Writer型もReader型と同じく,
多くの型が存在します.典型的な型を次に紹介します.
FileWriter- ファイル(
File型)に書き込むためのWriter型.
- ファイル(
PrintWriterprintfやprintln,printが利用できるWriter型.- 他の
Writer型は文字単位でしか出力できない.
- 他の
StringWriter- 文字列(
String型)に書き込むためのWriter型.
- 文字列(
OutputStreamWriterOutputStream型をWriter型に変換するためのWriter型.
ここに挙げた以外にもいくつかのWriter型が存在しますが,この講義では,FileWriter,
PrintWriter の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型を構築します.
次に,構築したFileWriterをPrintWriterに渡し,文字列の出力が
可能なPrintWriterを構築します.
そして,文字列をファイルに書き込むには,PrintWriter型の変数outに対してprintメソッドを呼び出して,文字列を書き込んでいます.
他に,printlnやprintfメソッドも用意されています.
最後に,これ以上ストリームを利用しないため,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
- 最初は何もファイルがありません.
java OutputN 3 file3.txtを実行して,file3.txtに値を書き込んでいます.OutputNの実行時に3が渡されていますので,1, 2, 3 とカウントアップした値が各行に出力されています.cat file3.txtで内容の確認をしています.
java OutputN 10 file10.txtを実行して,file10.txtに値を書き込んでいます.cat file10.txtで内容の確認をしています.
例題 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つのファイルの違いを確認するコマンド
$ # 何も違いがないので,何も出力されない.