Reader と Writer(2)


今度はファイルからの入出力をバッファリングして効率化を図ります。 java.io にはそのためのクラス BufferedReader, BufferedWriter が用意されています。 バッファサイズは一般にシステムに依存しますが、 これらのクラスを利用することでプログラムの表面には直接現れません。 このようなスタイルは Javaの大きな特徴です。 異なるシステムの上でも効率よく動作するプログラムを開発することが可能に なるわけです。
BufferedReader, BufferedWriter のオブジェクトは、 既に存在する他の Reader,Writer のオブジェクト 、たとえば FileReaderから生成することができます。 (実際のプログラムでは、例外処理やエラー処理がが付け加わります。)

File file;               // 読み込むファイル
FileReader fr;           // ファイルを読み込むメソッドを提供
BufferedReader br;       // バッファリングして読み込むメソッドを提供
file = new File( argv[0] );  // ファイルのオブジェクトの生成
fr = new FileReader( file ); // FileReaderの生成
br = new BufferedReader( fr ); // BufferedReaderの生成

BufferedReader がいったん生成されてしまえば、 後はそこから自由に読み込みが可能です。 たとえば、行単位でデータを処理するのなら、readLine() という メソッドが利用できます。 下のサンプルでは、読み込んだデータを行単位で 標準出力に表示します。 プログラムをながめると、あたかも一行ごとに読み込んでいるように見えますが、 ファイルからの読み込みは最適化されたサイズを単位にしてバッファ に読み込まれます。


String s;
while( ( s = br.readLine() ) != null ) {
         pw.println( s );
}

出力には PrintWriterというクラスが 利用されています。PrintWriterは OutputStreamWriter に 行単位の出力の操作が追加されたクラスです。 行の出力ごとに標準出力のバッファのフラッシュを行うように 指定することもできます。(コンストラクタの第2引数を true にします。)

PrintWriter pw;          // 標準出力に行単位で表示するメソッドを提供
pw = new PrintWriter( System.out, true );  // PrintWriterの生成

このプログラムも 先のサンプル と同様に、UNIX の catコマンドと似た働きをします。


import java.io.File;
import java.io.FileReader;
import java.io.PrintWriter;
import java.io.BufferedReader;
import java.io.IOException;

/** ファイルの内容を読み込み、標準出力へ表示する CatCommand2クラス */

public class CatCommand2 {

   /** 最初に呼び出されるメソッド */

       public static void main( String argv[] ) {

           File file;               // 読み込むファイル
           FileReader fr;           // ファイルを読み込むメソッドを提供
           BufferedReader br;       // バッファリングして読み込むメソッドを提供
           PrintWriter pw;          // 標準出力に表示するメソッドを提供

           try{
               if( argv.length != 1 ) {  // コマンド引数の指定が不正

                   System.err.println("Usage: java CatCommand filename");
                   System.exit(0);
               }

               file = new File( argv[0] );  // ファイルオブジェクトの生成

               if( !file.isFile() ) {   // 通常のファイルではない

                   System.err.println( argv[0] + "is not a normal file.");
                   System.exit(0);
               }
               if( !file.canRead() ) {  // ファイルの読み込み許可がない

                   System.err.println("File" + argv[0] + "not readable.");
                   System.exit(0);
               }

               fr = new FileReader( file );
               br = new BufferedReader( fr );
               pw = new PrintWriter( System.out, true );

           // 1行単位で入出力
               String s;
               while( ( s = br.readLine() ) != null ) {
                 pw.println( s );
               }
           }
           catch( NullPointerException e ) {  // 文字列データがない

               System.err.println("Usage: java CatCommand filename");
               System.exit(0);
           }
           catch( IOException e ) {  // 入出力のエラーが発生

               System.err.println("IO Error....");
               System.exit(0);
           }
       }
}