BufferedReaderクラス - 萌えJava超入門
テキストファイルを読み込む

BufferedReaderクラス

テキストファイルの中身を、行単位にまとめた文字列として読み込みます。

java.io.BufferedReader

萌えJava超入門
これも Readerクラスの仲間だ。
テキストファイルの中身を
行単位にまとめた文字列として取得できる。

目次

1.継承関係


BufferedReaderの継承関係
    java.io.Reader 抽象クラス
        |
        └ java.io.BufferedReader クラス
  



2.コンストラクタ


BufferedReaderクラスは、引数に Readerクラスのインスタンスを与えると、
文字を行単位にまとめて文字列にします。
この章では 引数に前のページで紹介させていただきました InputStreamReaderクラスを使用します。
InputStreamReaderクラスは、Readerクラスのサブクラスです。

 public BufferedReader(Reader in)             

コンストラクタ 書式
Reader in;
   BufferedReader br = new BufferedReader(in);
import java.io.BufferedReader; が必要です。




3. readLineメソッド

readLineメソッドを実行するたびに、引数のReaderから、次の改行コードまでの文字列を返します。
終端に達すると null を返します。

 public String readLine() throws java.io.IOException

readLineメソッド 書式
BufferedReader br;
   String str = br.readLine();

例外処理を記述する場合には、以下をインポートする必要があります。
例外のimport
import java.io.IOException;

ストリームの終わりに達した場合
null を返します。
萌えJava超入門
ここ、ちょっと気を付けて。
終端は -1 ではなくて nullだ。
戻り値のデータ型が String だからな。
萌えJava超入門 萌えJava超入門
ホントだ。


4. closeメソッド

読み込みが終わったら必ず closeします。
引数に与えた Reader# の InputStream# を閉じてリソースを解放します。
つまり、BufferedReader# を close すれば、
引数に与えた Reader# や InputStream# をあらためて close する必要はありません。

 public void close() throws java.io.IOException

closeメソッド 書式
BufferedReader br;
   br.close();

例外処理を記述する場合には、以下をインポートする必要があります。
例外のimport
import java.io.IOException;

萌えJava超入門 萌えJava超入門 萌えJava超入門


5.サンプルコード

前回同様 hello.txt を、wsディレクトリに配置しました。
Sample04_01 を wsディレクトリで実行して中身を読み込んでみましょう。

This is hello.txt
こんにちわ。
end

//Sample04_01.java

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.UnsupportedEncodingException;
import java.io.FileNotFoundException;
import java.io.IOException;

class Sample04_01{
  public static void main(String[] args){

      String path = "hello.txt";
      File file = new File(path);

      try {
          FileInputStream inStream = new FileInputStream(file);
          InputStreamReader reader = new InputStreamReader(inStream, "UTF-8");
          BufferedReader br = new BufferedReader(reader);
          String strLine;
          while((strLine = br.readLine()) != null) {
              System.out.println(strLine);
          }
          br.close();

      } catch (UnsupportedEncodingException e) {
          e.printStackTrace();
      } catch (FileNotFoundException e) {
          e.printStackTrace();
      } catch (IOException e){
          e.printStackTrace();
      }
  }
}

コマンドライン
>cd ws
ws>javac -encoding UTF-8 Sample04_01.java
ws>java Sample04_01
This is hello.txt
こんにちわ。
end


重要
   BufferedReaderで readLineした場合は、
   改行コードが区切り文字として扱われて消えてしまっている点に
   ご注意ください。

萌えJava超入門
これがテキストファイルを読み込む
最終形態だな。
萌えJava超入門
readLineだと
文字列で取得できるのが
便利っスね。
萌えJava超入門
Fileクラスで
FileInputStreamクラスで
InputStreamReaderで
BufferedReader?!
長い!
長いわよ!!
萌えJava超入門
まず間違いなく
コピペだな。
次、テンプレ
行ってみよう。


6. ArrayListを利用したテンプレート


テキストファイルから読み取った文字列を一行ずつ処理したい場合は、
ArrayList<String> で受けると便利です。
配列で受けられればいいのですが、何行の文字列が得られるか事前に分からないので
ArrayListの出番というわけです。

//Sample04_02.java

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.UnsupportedEncodingException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;

class Sample04_02{
  public static void main(String[] args){

      String path = "hello.txt";
      File file = new File(path);
      ArrayList<String> list = null; //try-catch の外で宣言。

      try {
          //ここは慣用句です。
          BufferedReader br = new BufferedReader(
                        new InputStreamReader(
                            new FileInputStream(file), "UTF-8"
                        )
                    );

          //list に書き出します。
          list = new ArrayList<String>();
          String strLine;
          while((strLine = br.readLine()) != null) {
              list.add(strLine);
          }
          br.close();

      } catch (UnsupportedEncodingException e) {
          e.printStackTrace();
      } catch (FileNotFoundException e) {
          e.printStackTrace();
      } catch (IOException e){
          e.printStackTrace();
      }
      //list の表示
      if(list!=null){
          for(String str : list){
              System.out.println(str);
          }
      }else{
          System.out.println("null");
      }
  }

}

コマンドライン
>cd ws
ws>javac -encoding UTF-8 Sample04_02.java
ws>java Sample04_02
This is hello.txt
こんにちわ。
end


萌えJava超入門 萌えJava超入門
お~!
テキストファイルが
ArrayListになった!



萌えJava超入門
何かに使えそうな
予感がするだろ?
実用例
行単位でテキストを処理したい場合は、ArrayList<StringE> で受けるのが便利です。
CSVファイルの様なスプレッドシートを表すテキストは、これに当てはまります。
簡易版ですが、次のページで紹介させていただきますね。



7. StringBuilderを利用したテンプレート


テキストファイルから読み取った文字列を一つの文字列として処理したい場合は、
StringBuilder で受けると便利です。

//Sample04_03.java

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.UnsupportedEncodingException;
import java.io.FileNotFoundException;
import java.io.IOException;

class Sample04_03{
  public static void main(String[] args){

      String path = "hello.txt";
      File file = new File(path);
      StringBuilder strb = null; //try-catch の外で宣言。

      try {
          //ここは慣用句です。
          BufferedReader br = new BufferedReader(
                        new InputStreamReader(
                            new FileInputStream(file), "UTF-8"
                        )
                    );

          //StringBuilder に書き出します。
          strb = new StringBuilder();
          String strLine;
          while((strLine = br.readLine()) != null) {
              strb.append(strLine);
              strb.append("\n"); //改行しています。
          }
          br.close();

      } catch (UnsupportedEncodingException e) {
          e.printStackTrace();
      } catch (FileNotFoundException e) {
          e.printStackTrace();
      } catch (IOException e){
          e.printStackTrace();
      }
      //strb の表示
      if(strb!=null){
          System.out.println(strb.toString());
      }else{
          System.out.println("null");
      }
  }

}

コマンドライン
>cd ws
ws>javac -encoding UTF-8 Sample04_03.java
ws>java Sample04_03
This is hello.txt
こんにちわ。
end


萌えJava超入門
こちらは改行文字(\n)を含む
文字列を検索したい場合に使える。



萌えJava超入門
用途によって
使い分けるんスね。
萌えJava超入門
やっぱり覚えられないわ。
コピペでがんばるね。
萌えJava超入門
大丈夫
大丈夫。
実用例
HTMLで閉じタグがどこにあるか検索する場合は StringBuilder が便利です。
例えば、該当する id のタグを丸ごと差し替えたい場合は、
  1. 「.html」で終わるファイル名を File#.listFile でリストアップ(File[])
  2. ファイルごとに、Sample04_03 の要領でテキストを StringBuilder に読み込みます。
  3. StringBuilder#indexOf で 「<div id="hogehoge"」 を検索
  4. 続いて閉じタグ「</div>」を検索(入れ子は回避ね。)
  5. StringBuilder#delete でタグ全体を削除
  6. StringBuilder#insert で任意の文字列を追加
って感じです。
もちろんこのチュートリアルを作成するのにも使ってますよ。



使って慣れましょう。




© 2019 awasekagami