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);
}
}
}