next up previous contents
Next: try と catch Up: File I/O Previous: File I/O

FileInputStream と FileOutputStream

リスト1は、Cでのファイル・コピーの例です。ファイル・ディスクリプタとreadと writeを使った、いわゆる低水準の入出力といわれるもので、最も、基本的なCプロ グラムの一つです。

リスト 1

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

リスト 2

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



maruyama@wakhok.ac.jp