リスト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 は、出力ストリーム