リスト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); // 標準出力へ一バイト