テキストファイルを読み込む
BufferedReaderクラス
テキストファイルの中身を、行単位にまとめた文字列として読み込みます。
java.io.BufferedReader
これも Readerクラスの仲間だ。
テキストファイルの中身を
行単位にまとめた文字列として取得できる。
目次
1.継承関係
BufferedReaderの継承関係
java.io.Reader 抽象クラス
|
└ java.io.BufferedReader クラス
2.コンストラクタ
BufferedReaderクラスは、引数に Readerクラスのインスタンスを与えると、
文字を行単位にまとめて文字列にします。
この章では 引数に前のページで紹介させていただきました InputStreamReaderクラスを使用します。
InputStreamReaderクラスは、Readerクラスのサブクラスです。
public BufferedReader(Reader in)
3. readLineメソッド
readLineメソッドを実行するたびに、引数のReaderから、次の改行コードまでの文字列を返します。
終端に達すると null を返します。
public String readLine()
throws java.io.IOException
例外処理を記述する場合には、以下をインポートする必要があります。
例外のimport
import java.io.IOException;
ストリームの終わりに達した場合
null を返します。
ここ、ちょっと気を付けて。
終端は -1 ではなくて nullだ。
戻り値のデータ型が String だからな。
ホントだ。
4. closeメソッド
読み込みが終わったら必ず closeします。
引数に与えた Reader# の InputStream# を閉じてリソースを解放します。
つまり、BufferedReader# を close すれば、
引数に与えた Reader# や InputStream# をあらためて close する必要はありません。
public void close()
throws java.io.IOException
例外処理を記述する場合には、以下をインポートする必要があります。
例外のimport
import java.io.IOException;
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した場合は、
改行コードが区切り文字として扱われて消えてしまっている点に
ご注意ください。
これがテキストファイルを読み込む
最終形態だな。
readLineだと
文字列で取得できるのが
便利っスね。
Fileクラスで
FileInputStreamクラスで
InputStreamReaderで
BufferedReader?!
長い!
長いわよ!!
まず間違いなく
コピペだな。
次、テンプレ
行ってみよう。
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
お~!
テキストファイルが
ArrayListになった!
何かに使えそうな
予感がするだろ?
実用例
行単位でテキストを処理したい場合は、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
こちらは改行文字(\n)を含む
文字列を検索したい場合に使える。
用途によって
使い分けるんスね。
やっぱり覚えられないわ。
コピペでがんばるね。
大丈夫
大丈夫。
実用例
HTMLで閉じタグがどこにあるか検索する場合は StringBuilder が便利です。
例えば、該当する id のタグを丸ごと差し替えたい場合は、
- 「.html」で終わるファイル名を File#.listFile でリストアップ(File[])
- ファイルごとに、Sample04_03 の要領でテキストを StringBuilder に読み込みます。
- StringBuilder#indexOf で 「<div id="hogehoge"」 を検索
- 続いて閉じタグ「</div>」を検索(入れ子は回避ね。)
- StringBuilder#delete でタグ全体を削除
- StringBuilder#insert で任意の文字列を追加
って感じです。
もちろんこのチュートリアルを作成するのにも使ってますよ。
使って慣れましょう。