バッファリング


バッファに入れる

文字ストリームの入出力にバッファを使う方法をここで覚えましょう
バッファを有効利用することで、物理デバイスへの読み書きを減少させることができます

物理デバイスへのアクセス回数の減少はパフォーマンスの向上につながります
そのため、バッファにデータを入れる方法は非常に大切です

文字ストリームへの出力をバッファに入れるには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()メソッドなども実装しています



前のページへ戻る次のページへ