Writer型
Writer型の利用方法
出力を扱うWriter
を利用する方法を確認しましょう.Writer
型もReader
型と同じく,
多くの型が存在します.典型的な型を次に紹介します.
FileWriter
- ファイル(
File
型)に書き込むためのWriter
型.
- ファイル(
PrintWriter
printf
やprintln
,print
が利用できるWriter
型.- 他の
Writer
型は文字単位でしか出力できない.
- 他の
StringWriter
- 文字列(
String
型)に書き込むためのWriter
型.
- 文字列(
OutputStreamWriter
OutputStream
型を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つのファイルの違いを確認するコマンド
$ # 何も違いがないので,何も出力されない.