リスト1は、Cでのファイル・コピーの例です。ファイル・ディスクリプタとreadと writeを使った、いわゆる低水準の入出力といわれるもので、最も、基本的なCプロ グラムの一つです。
#include <stdio.h> #include <sys/fcntl.h> #define BUFSIZE 80 main (int argc, char ** argv){ int in , out ; char buff[BUFSIZE] ; int len ,result; if ( argc != 3 ){ fprintf(stderr,"Usage: %s file1 file2\n",argv[0]); exit(-1); } in = open(argv[1],O_RDONLY); if ( in == -1 ){ fprintf(stderr,"Can't open file: %s\n",argv[1]); exit(-1); } out = open(argv[2],O_WRONLY); if ( out == -1 ){ fprintf(stderr,"Can't open file: %s\n",argv[2]); exit(-1); } while( (len = read(in,buff,BUFSIZE)) != 0 ){ if ( len == -1 ){ fprintf(stderr,"Read to %s Failed !!\n",argv[1]); exit(-1); } result=write(out,buff,len); if ( result != len ){ fprintf(stderr,"Write to %s Failed !!\n",argv[2]); exit(-1); } } }
import java.io.*; class Copy1 { static final int BUFSIZE = 80 ; public static void main (String argv[]){ try { FileInputStream in = new FileInputStream(argv[0]); FileOutputStream out = new FileOutputStream(argv[1]); byte buff[] = new byte[BUFSIZE] ; int len ; while( (len = in.read(buff,0,BUFSIZE)) != -1 ){ out.write(buff,0,len); } } catch (Exception e ){ System.err.println("Exception :" + e); } } }
リスト2は、先のリスト1に対応したJava のプログラムです。クラス FileInputStream
のインスタンスである変数 in に対して、メソッド read を呼び出すことで、ファイル
からの入力を実現しています。出力は、同様に、クラス FileOutputStream の インス
タンスである out に対する、メソッド write の呼び出しという形を取っています。
ここでは、先のリスト1と比べて、次の三つの事に注意して下さい。
第一は、Java の例では、Cでの open に当たるものが、見あたらないということです。
FileInputStream , FileOutputStream のインスタンスが生成されるということが、
ファイルのオープンに相当しています。こうして生成されたインスタンスを、
「ストリーム」と呼びます。
第二は、Cの例では、ファイルのオープン時に返される、ファイル・ディスクリプタを
引数として、関数 read , write が呼ばれるのですが、Java では、インスタンスで
ある入力ストリームに対するメソッドの呼び出しとしてread , write が
実行されます。
第三に、細かいことですが、read , write の引数の意味が違っています。
C in = open(file, O_RDONLY); // in は、ファイル・ディスクリプタ out = open(file, O_WRONLY); // out は、ファイル・ディスクリプタ ---------------------------------------------------------------------------- Java in = new FileInputStream(file); // in は、入力ストリーム out = new FileOutputStream(file); // out は、出力ストリーム
C read(in, buf, BUFSIZE); // in は、ファイル・ディスクリプタ write(out,buf, SIZE); // out は、ファイル・ディスクリプタ ---------------------------------------------------------------------------- Java in.read(buf, 0, BUFSIZE); // in は、入力ストリーム out.write(buf, 0, SIZE); // out は、出力ストリーム