Reader と Writer(1)


Reader,Writer のサブクラスとFileクラスを使ってファイルおよび 標準入出力を取り扱ってみましょう。
ファイルの内容を読み込み、標準出力へ表示します。 プログラムの最初のポイントは、ファイルのオブジェクトおよび ファイル入力、標準出力への出力を担当するオブジェクトの生成です。 (実際のプログラムでは、例外処理やエラー処理がが付け加わります。)

File file;               // 読み込むファイル
FileReader fr;           // ファイルを読み込むメソッドを提供
OutputStreamWriter osw;  // 標準出力に表示するメソッドを提供
file = new File( argv[0] );  // ファイルのオブジェクトの生成
fr = new FileReader( file ); // FileReaderの生成
osw = new OutputStreamWriter( System.out ); // OutputstreamWriterの生成

入出力を行うメソッドは、Reader,Writer のサブクラスに共通で、 read() および write() が基本です。 たとえば、1文字ごとに読み込みと書き出しを繰り返すとすると、 次のようになります。


int c;
while( ( c = fr.read() ) != -1 ) {  // 1文字単位で入出力
   osw.write( c );
}

ただし、多くのシステムでは画面への表示を効率良く行うため、 標準出力のバッファリングを行っています。 それを強制的に出力させ、確実に表示を行わせるには Writerクラスのflush()メソッドを使います。 次にプログラム全体を示しておきましょう。 このプログラムは、コマンドラインからファイル名を受け取り、 そのファイルの内容を標準出力に表示します。UNIX の catコマンドと 似た働きをするので、クラス名は CatCommand としました。


import java.io.File;
import java.io.FileReader;
import java.io.OutputStreamWriter;
import java.io.IOException;

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

public class CatCommand {

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

       public static void main( String argv[] ) {

           File file;               // 読み込むファイル
           FileReader fr;           // ファイルを読み込むメソッドを提供
           OutputStreamWriter osw;  // 標準出力に表示するメソッドを提供

           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 );
               osw = new OutputStreamWriter( System.out );

               int c;
               while( ( c = fr.read() ) != -1 ) {  // 1文字単位で入出力
                 osw.write( c );
               }
               osw.flush();   // 標準出力のバッファの強制フラッシュ
           }
           catch( NullPointerException e ) {  // 文字列データがない

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

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