ファイル入出力

  1. 目的

    アプリケーションで文字型のファイルを読み・書きする方法を紹介します。セキュリティの問題のためファイル入出力はアプレットでは禁止されています。

  2. 文字型ファイル

    1. ファイルを開く
       文字型ファイルのアクセスにも、文字単位と行単位の方法があります。後者は、行単位で入出力を行うのに対し、前者は1文字単位で入出力を行います。
       ファイルを開くには、FileReader クラスと FileWriter クラスを利用します。

       FileReader fir = new FileReader("filecopy.java");
       FileWriter fwr = new FileWriter("filecopy.txt");

      で指定できます。new はファイルのオープン動作を兼ねます。ファイルがない場合、FileNotFoundException という エラー を投げますから、これを try-catch で受ける必要があります。

    2. 1文字読み・書き出し
        一文字読みは fir.read() で行い、int 型で文字を返します。したがって、文字として扱うには、(char) でキャストします。
       ファイルが尽きた場合は -1 を返します。1文字出力は fwr.write(chr); で、行います。

    3. 行単位の入出力
       行単位で入力を行うには、BufferedReader クラスを通す必要があります。BufferedReader クラスは、いったんバッファを通して入出力を行いますから、適当な処理を行いながら入力ができます。

       FileReader fir = new FileReader("filecopy.java");
       BufferedReader bfr=new BufferedReader(fir);

      行の入力は
       bfr.readLine()
      で行います。入力がつきた場合、null を返します。

      出力も同様に、
       FileWriter fwr = new FileWriter("filecopy2.txt");
       BufferedWriter bwr=new BufferedWriter(fwr);
      で、BufferedWriter クラスのオブジェクトを作成し、

       bwr.write(st);
       bwr.newLine();

      で、1行を書き出します。newLine() は改行を書き出します。

    4. ファイルを閉じる
      各クラスのファイルは close() メソッドで閉じます。

       fwr.close();

       出力ファイルのクローズをしないと、ファイルが生成されなかったり、末尾が欠けます。

    5. PrintWriterクラス
       FileWriter クラスの替わりに、PrintWriter クラスを利用すると、文字だけでなく、直接、整数や小数をファイルに出力できます。

    6. バイナリの入出力
       バイナリでの入出力は、DataOutputStrean とDataInputStrean を利用します。

    7. オブジェクトの入出力
       Serializab;e インタフェースを組み込んだオブジェクトは、ObjectOutputStream により、そのまま、ファイルに出力したり、逆に、ObjectInputStream ファイルからオブジェクトに読み込み可能です。

    8. アプレットで読めるファイル
       アプレットでは、URLクラスを利用してサーバーにある一般ファイル画像音ファイルを読み込み可能です。

    9. エラー処理
       ファイル処理には、エラー処理が必須です。
       FileNotFoundException はファイルが見つからないときの処理を、IOException は入出力処理でおきた例外(エラー)処理を行います。e.printStackTrace() は処理状況を示すスタックの内容を表示します。

  3. プログラム

    1. プログラム
       filecopy.java ファイルを文字単位で filecopy.txt に、行単位で filecopy2.txt にコピーします。
      import java.io.*;
      
      public class FIleCopy {
      
          public static void main(String[] args) {
              int chCount;
              int chr;
              String st="";
              
              //文字単位の入出力
              try {
                  FileReader fir = new FileReader("filecopy.java");
                  FileWriter fwr = new FileWriter("filecopy.txt");
      
                  while ((chr = fir.read()) != -1) {
                      //st += (char) chr;
                      fwr.write(chr);
                  }
      
                  fwr.close();
                  fir.close();
              } catch (FileNotFoundException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              }
              //System.out.println(st);
              
              //行単位の入出力
              st="";
              try {
                  FileReader fir = new FileReader("filecopy.java");
                  BufferedReader bfr=new BufferedReader(fir);
                  FileWriter fwr = new FileWriter("filecopy2.txt");
                  BufferedWriter bwr=new BufferedWriter(fwr);
      
                  while ((st = bfr.readLine()) != null) {
                      System.out.println(st);
                      bwr.write(st);
                      bwr.newLine();          
                  }
      
                  bwr.close();
              } catch (IOException e) {
                  e.printStackTrace();
              }
      
          }
      }

    2. 実行
       filecopy.java ファイルをコピーし、二つのファイルを作成します。