next up previous contents
Next: DataInputStream と PrintStream Up: File I/O Previous: trycatch

read , write いろいろ

リスト3は、Cでの高水準入出力でのファイル・コピープログラムの例です。 fopen で返されたファイル・ポインターと fgetc, fputc を使って、一バイト毎に ファイルをコピーしています。

リスト 3

#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 は、 その違いを自動的に認識します。これは、前回、コンストラクタについては、説明し ました。

リスト 4

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



maruyama@wakhok.ac.jp