まとめてテキストを読む

広告

FileReaderを使ってファイルを読み込む場合には、1文字読み込んでは1文字処理して、と言うのを繰り返すため、非常に効率が悪いです。その為、ある程度まとめて読み込んでから、まとめて処理するためのクラスが用意されています。

BufferedReaderクラスを使います。なぜ最初からこのクラスを使わないかというと、このクラスはFileReaderクラスを拡張する形で利用するためです。FileReaderクラスの持つ基本機能でファイルから読み込みは行うのですけど、それにBufferedReaderクラスをかぶせて使うことでまとめて読み込む機能を持てるようになります。

使い方は下記のようになります。

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

FileReaderクラスのオブジェクトを作成するところまでは今までと同じですが、このオブジェクトを引数としてBufferedReaderクラスのオブジェクトを作成します。そしてFileReaderクラスのオブジェクトではなく、BufferedReaderクラスのオブジェクトに対して読み込み用のメソッドを実行してテキストファイルからテキストを読み込みます。

上記はまとめて下記のように記述しても構いません。

File file = new File(file_name);
BufferedReader br = new BufferedReader(new FileReader(file));

テキストを1行単位で読む

次にファイルの読み込みの仕方です。FileReaerクラスの時と同じく"read"メソッドもありますが、1行まとめて読むための"readLine"メソッドが別に用意されています。

public String readLine() throws IOException

1 行のテキストを読み込みます。1 行の終端は、改行 (「\n」) か、復帰 (「\r」)、または復行と
それに続く改行のどれかで認識されます。

戻り値:
  行の内容を含む文字列、ただし行の終端文字は含めない。ストリームの終わりに達している場合は
    null
例外:
  IOException - 入出力エラーが発生した場合

テキストファイルから1行分のテキストをまとめて読み込みます。注意する点は、改行文字は読み込んだ文字に含まれない事です。よって1行ごとに、改行を含まないテキストを読み込んでString型の値として返してくれます。

このメソッドを使うとまずファイルの先頭の1行を読み込んでくれます。そして自動的に読み込む位置が次の行に移ります。その為、繰り返し"readLine"メソッドを実行することで、ファイルの先頭から最後まで順にテキストを読み込んでくれることになります。

実際には下記のように利用します。

try{
  File file = new File("c:\\tmp\\test.txt");
  BufferedReader br = new BufferedReader(new FileReader(file));

  String str = br.readLine();
  while(str != null){
    System.out.println(str);

    str = br.readLine();
  }

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

まとめて下記のように記述しても構いません。

try{
  File file = new File("c:\\tmp\\test.txt");
  BufferedReader br = new BufferedReader(new FileReader(file));

  String str;
  while((str = br.readLine()) != null){
    System.out.println(str);
  }

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

今回はファイルから読み込んだ値には改行文字は含まれていませんので、"print"メソッドではなく"println"メソッドを使います。

ファイルを閉じる

また、BufferedReaderクラスを使う場合にも、使い終わったら閉じておく必要があります。BufferedReaderクラスでもFileReaderクラスと同じように"close"メソッドを使います。

public void close() throws IOException

ストリームを閉じます。

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

BufferedReaderクラスのオブジェクトに対して"close"処理を行えば、その元になっているFileReaderクラスの方は"close"しなくても構いません。

サンプル

では試してみましょう。

streamTest3.java

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

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

      if (checkBeforeReadfile(file)){
        BufferedReader br = new BufferedReader(new FileReader(file));

        String str;
        while((str = br.readLine()) != null){
          System.out.println(str);
        }

        br.close();
      }else{
        System.out.println("ファイルが見つからないか開けません");
      }
    }catch(FileNotFoundException e){
      System.out.println(e);
    }catch(IOException e){
      System.out.println(e);
    }
  }

  private static boolean checkBeforeReadfile(File file){
    if (file.exists()){
      if (file.isFile() && file.canRead()){
        return true;
      }
    }

    return false;
  }
}

結果は同じですが、上記をコンパイルして実際に実行してみると下記のようになります。

p3

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。