1.3. java.io.FileWriter
「FileWriter」はファイルへの文字単位の出力を行うクラスです。Unicodeで管理されている文字データをOSのデフォルトの文字コードに変換し、指定したファイルへ書き込みを行います。
FileWriter writer=new FileWriter("output.txt"); String text="sample"; writer.write(text); writer.flush(); writer.close();
1行目で出力ストリームを生成しています。指定されたファイルが無い場合にはファイルを生成し、ある場合には上書きを行います。「FileWriter」は「FileReader」と異なり、boolean型の2つ目の引数を取るコンストラクタがあります。これを使用した場合は、ファイルへの出力は上書きではなく追加にすることができます。
3行目でファイルへの書き込みを行っています。実際にはファイルバッファへ書き込んでいるだけなので、4行目の「flush」メソッドを呼び出さなければ、ファイルへの書き込みは行われません。5行目の「close」メソッドを呼び出した場合は、自動的に「flush」されるので4行目がなくても構いません。「close」メソッドは常に呼び出すくせをつけたほうが無難でしょう。
(実習課題2)
実習課題1のプログラムを改良しなさい。
- 任意のファイルへ保存する事ができる。
1.4. java.io.BufferedReader, java.io.BufferedWriter
「BufferedReader」「BufferedWriter」は他の入出力ストリームを利用する「フィルタ系」の、文字単位入出力クラスです。これら2つのクラスは入出力データをバッファリングする事により、効率的な入出力の実現を目標としています。例えば「BufferedWriter」は以下のようにする事により、1行単位でファイルから文字列を読み込む事ができるようになります。
BufferedReader reader=new BufferedReader(new FileReader("test.txt")); String line; while((line=reader.readLine())!=null){ System.out.println(line); } reader.close();
1行目で「BufferedReader」の入力ストリームを生成しています。コンストラクタは「Reader」オブジェクトを取るので、「Reader」クラスのサブクラスであれば何でも構いません。この場合は「FileReader」と組み合わせていますので、ファイルからの入力をバッファリングしながら読み込む事になります。このように「FileReader」と組み合わせて使用するのが最も多いでしょう。
3行目の「readLine」メソッドは1行ずつストリームから読み込むメソッドです。何も読み込めなかった場合には「null」を返します。1行の区切りは、改行コード(\n)か復帰コード(\r)、または「\r\n」で識別されます。また返り値に改行コードは含まれません。
「BufferedWriter」の使用例は以下の通りです。ファイルへの出力をバッファリングしています。
BufferedWriter writer=new BufferedWriter(new FileWriter("output.txt")); writer.write("sample"); writer.newLine(); writer.write("sample"); writer.flush(); writer.close();
1行目で「BufferedWriter」の出力ストリームを生成しています。引数は、「Writer」クラスのサブクラスであれば何でも構いません。「BufferedReader」同様、「FileWriter」と組み合わせて使用するのが最も多いです。
2から4行目で書き込みを行い、5行目でフラッシュしています。「FileWriter」と唯一といってもいい違いは、「newLine」メソッドです。このメソッドはOS固有の改行文字を出力するメソッドです。OSによっては改行文字が「\n」とは限らないので、このメソッドを使用するほうが直接「\n」を書き込むより適切でしょう。
(実習課題3)
実習課題2のプログラムを改良しなさい。
- ファイルへの入出力に「BufferedReader」および「BufferedWriter」を使用するようにする事。
- 拡張子が「.java」のファイル以外、読み込み/保存の対象としない。