リスト3は、Cでの高水準入出力でのファイル・コピープログラムの例です。 fopen で返されたファイル・ポインターと fgetc, fputc を使って、一バイト毎に ファイルをコピーしています。
#include <stdio.h>
main (int argc, char ** argv){
FILE * in , * out ;
int ch ;
if ( argc != 3 ){
fprintf(stderr,"Usage: %s file1 file2\n",argv[0]);
exit(-1);
}
if ( ( in = fopen(argv[1],"r")) == NULL ){
fprintf(stderr,"Can't open file: %s\n",argv[1]);
exit(-1);
}
if ( ( out = fopen(argv[2],"w")) == NULL ){
fprintf(stderr,"Can't open file: %s\n",argv[2]);
exit(-1);
}
while( (ch = fgetc(in)) != EOF ){
fputc(ch,out);
}
}
このリスト3に対応するJava プログラムを見てみましょう。
Cでは、ファイルのオープンの仕方が変わったのですが、この例では、先の例に
引続き、FileInputStream,FileOutputStream でストリームは生成されています。
この例も、一バイト毎のコピーを実行しているのですが、ファイルから一文字 読み/書きするためのメソッドには、read/writeが使われています。もう、お気 づきでしょうが、このread/writeは、バッファにまとめて読み書きする、リスト2の read/writeとは異なるメソッドです。このように、Javaでは、同じ名前のメソッドで も、引数の数・タイプの違いによって、働きの異なるメソッドが存在し、Java は、 その違いを自動的に認識します。これは、前回、コンストラクタについては、説明し ました。
import java.io.*;
class Copy2 {
public static void main (String argv[]){
try {
FileInputStream in = new FileInputStream(argv[0]);
FileOutputStream out = new FileOutputStream(argv[1]);
int ch ;
while( (ch = in.read()) != -1 ){
out.write(ch);
}
} catch (Exception e ){
System.err.println("Exception :" + e);
}
}
}
C ch = fgetc(in); // in は、ファイル・ポインタ
ch = getchar(); // 標準入力から一バイト
fputc(ch,out); // out は、ファイル・ポインタ
putchar(ch); // 標準出力へ一バイト
----------------------------------------------------------------------------
Java ch = in.read(); // in は、入力ストリーム
ch = System.in.read(); // 標準入力から一バイト
out.write(ch) // out は、出力ストリーム
System.out.write(ch); // 標準出力へ一バイト