バッファリング
バッファに入れる
文字ストリームの入出力にバッファを使う方法をここで覚えましょう
バッファを有効利用することで、物理デバイスへの読み書きを減少させることができます
物理デバイスへのアクセス回数の減少はパフォーマンスの向上につながります
そのため、バッファにデータを入れる方法は非常に大切です
文字ストリームへの出力をバッファに入れるにはjava.io.BufferedWriterクラスを使用します
このクラスのコンストラクタは次のようになっています
public BufferedWriter( Writer out )
public BufferedWriter( Writer out, int sz )
パラメータに渡すのはWriterクラスのオブジェクトです
Writerクラスは文字ストリームの抽象クラスです
BufferedWriterクラスやFileWriterクラスのスーパークラスです
ということは、FileWriterクラスのオブジェクトなどを渡しても良いですね
二つ目の構文のszには、バッファのサイズを指定します
しかし、通常はデフォルトのサイズで十分とされています
BufferedWriterクラスはWriterクラスのメソッドであるwrite()メソッドなどを実装しています
write()の内容はFileWriter()クラスの説明でしたものと同じです
このほかに、BufferedWriterクラスにはnewLine()メソッドが定義されています
このメソッドは現在の位置に行区切文字を入れます。これは、かならずしも '\n' ではありません
public void newLine() throws IOException
この方法で、物理デバイスのファイルに書き込んでみましょう
FileWriterクラスの時と同様に、最後にフラッシュする(または後処理)することを忘れないでください
import java.io.*;
class test {
public static void main(String args[]) {
try {
FileWriter fp = new FileWriter(args[0]);
BufferedWriter buf = new BufferedWriter(fp);
buf.write("Kitty on your lap");
buf.newLine();
buf.write("Card Captor SAKURA");
buf.close();
}
catch(IOException e) {
System.out.println("IOエラー : " + e);
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("java test <ファイル名>");
}
}
}
大量の文字データの出力には、この方法が有効です
FileWriterクラスと使い分け、プログラムの用途に応じて的確な判断をしましょう
バッファに読み取る
文字ストリームへの出力をバッファに入れる方法はわかりました
今度は文字ストリームからの入力をバッファに入れる方法を覚えましょう
基本的な流れはWriterと同様です
文字ストリームからの入力をバッファに入れるにはjava.io.BufferedReaderクラスを使用します
コンストラクタは次のとおりです
public BufferedReader( Reader in, int sz )
public BufferedReader( Reader in )
パラメータに渡しているのはReaderクラスのオブジェクトです
Writerクラスに対するのがReaderクラスで、文字ストリームを読み取る抽象クラスです
BufferedReaderクラスやFileReaderクラスのスーパークラスなので、FileReaderクラスのオブジェクトなども渡せます
BufferedReaderクラスが実装するread()も、FileReaderクラスの説明のものと同じです
また、このクラスには行区切文字までを読み込むreadLine()メソッドが定義されています
public String readLine() throws IOException
これは行区切り文字を除いた文字列を返します
ファイルの終端にたどり着くと null を返します
改行文字 '\n'、キャリッジ リターン '\r'、キャリッジ リターンの直後の改行文字までが1つの行と見なされます
import java.io.*;
class test {
public static void main(String args[]) {
String str;
try {
FileReader fp = new FileReader(args[0]);
BufferedReader buf = new BufferedReader(fp);
while(true) {
if ((str = buf.readLine()) == null) break;
System.out.println(str);
}
buf.close();
}
catch(IOException e) {
System.out.println("IOエラー : " + e);
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("java test <ファイル名>");
}
}
}
このサンプルでは使っていませんが、当然read()メソッドなども実装しています