テキストファイルを読む

広告

ファイルからテキストを読み込むためには色々なクラスが用意されています。まずは基本となる"FileReader"クラスを使ってみます。

まず読み込みたいファイルを対象としてFileクラスのオブジェクトを作成します。そして、そのオブジェクトを引数としてFileReaderクラスのオブジェクトを作成します。(Fileクラスについては『ファイルを管理する』を参照して下さい)。

File file = new File(file_name);
FileReader filereader = new FileReader(file);

これで対象のファイルからテキストの読み込みを行う準備が出来ました。作成したFileReaderクラスのオブジェクトに対して、文字を読むメソッドを実行します。

ちなみにFileReaderクラスのオブジェクトを作成する場合には、"FileNotFoundException"という例外が発生する可能性があるため、例外の処理をしておかなければいけません。(例外については『ファイルを作成する』にて少し説明しています)。

try{
  File file = new File("c:¥¥tmp¥¥test.txt");
  FileReader filereader = new FileReader(file);
}catch(FileNotFoundException e){
  System.out.println(e);
}

テキストを読む

次にファイルから文字を読み込みます。FileReaderクラスを使う場合には基本的に1文字ずつ読み込んでいきます。まとめて読むということが出来ませんので、効率はかなり悪いです。

単一の文字を読み込みます。

戻り値:
  読み込まれた文字。ストリームの終わりに達した場合は -1
例外:
  IOException - 入出力エラーが発生した場合

"read"メソッドでファイルから文字を1文字読み込みます。読み込んだ値はint型の値として取得できます。この整数は何だと言うと文字の文字コードを表す整数となってます。読み込んだ文字を、文字として表示する場合は下記のようにしてください。

try{
  File file = new File("c:¥¥tmp¥¥test.txt");
  FileReader filereader = new FileReader(file);

  int ch = filereader.read();
  System.out.println((char)ch);
}catch(FileNotFoundException e){
  System.out.println(e);
}catch(IOException e){
  System.out.println(e);
}

※"read"メソッドは"IOException"と言う例外を処理しなければいけません。

"read"で読み込んだ整数の値を、「(char)ch」とすることで文字に変換しています。

ファイルの最後まで読み込む

"read"メソッドを使うとまずファイルの先頭から1文字読み込みます。そして自動的に読み込む位置が次の文字に移ります。その為、連続して"read"メソッドを使うとファイルの先頭から順に1文字ずつ読み込んでくれます。そしてファイルの最後に達した時に"-1"という値を返してくれます。

その為、ファイルの先頭からファイルの最後まで文字を読み込みたい場合は、"read"メソッドの結果として"-1"を返してくるまで繰り返し"read"メソッドを実行します。例えば下記のような感じです。

try{
  File file = new File("c:¥¥tmp¥¥test.txt");
  FileReader filereader = new FileReader(file);

  int ch = filereader.read();
  while(ch != -1){
    System.out.print((char)ch);

    ch = filereader.read();
  }
}catch(FileNotFoundException e){
  System.out.println(e);
}catch(IOException e){
  System.out.println(e);
}

ファイルから1文字読み、その値が"-1"で無ければ画面に表示し、"-1"だった場合は終了します。なお上記のようなことを記述する場合は、まとめて下記のような書き方をすることが出来ます。

try{
  File file = new File("c:¥¥tmp¥¥test.txt");
  FileReader filereader = new FileReader(file);

  int ch;
  while((ch = filereader.read()) != -1){
    System.out.print((char)ch);
  }
}catch(FileNotFoundException e){
  System.out.println(e);
}catch(IOException e){
  System.out.println(e);
}

上記のwhile文の中の条件式の部分は、ファイルから1文字読み込んだ値を変数"ch"に格納し、そして格納された値が"-1"と同じかどうかを比較しています。よくこのようにまとめて記述しますので、書き方として覚えておいてください。

また1文字読んでは表示するということを繰り返しますので、画面への表示も「System.out.println((char)ch)」とすると1文字ずつ改行されて表示されてしまうため、「System.out.print((char)ch)」にしています。こうすれば1文字ずつ改行される事は無く、またファイルから改行文字を読み込んだ場合も、その改行文字も表示しようとするため結果的にファイルの改行があるところで、画面表示も改行されて表示されます。

ファイルを閉じる

ファイルに対する全ての処理が終わったら、ファイルを閉じます。"close"メソッドを使います。

ストリームを閉じます。

例外:
  IOException - 入出力エラーが発生した場合

以上のことからファイルから文字を読み込む場合の一連の流れは次のようになります。

try{
  File file = new File("c:¥¥tmp¥¥test.txt");
  FileReader filereader = new FileReader(file);

  int ch;
  while((ch = filereader.read()) != -1){
    System.out.print((char)ch);
  }

  filereader.close();
}catch(FileNotFoundException e){
  System.out.println(e);
}catch(IOException e){
  System.out.println(e);
}

サンプルプログラム

では実際に試してみましょう。

streamTest1.java

import java.io.File;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;

class streamTest1{
  public static void main(String args[]){
    try{
      File file = new File("c:¥¥tmp¥¥test.txt");
      FileReader filereader = new FileReader(file);

      int ch;
      while((ch = filereader.read()) != -1){
        System.out.print((char)ch);
      }

      filereader.close();
    }catch(FileNotFoundException e){
      System.out.println(e);
    }catch(IOException e){
      System.out.println(e);
    }
  }
}

プログラムを実行する前に、Cドライブの「tmp」というディレクトリの中に「test.txt」というファイルを用意しておきました。

test.txt

上記をコンパイルして実際に実行してみると下記のようになります。

p1

無事ファイルの読み込みを行うことが出来ました。

ただFileWriterを直接使って文字を読み込み場合、1文字読んでは処理をするという方法になってしまい不便ですので、実際にはこの後に見ていく他のクラスを組み合わせて普通は使います。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)