Java でテキストファイルに読み込む方法は、いくつかあります。
FileReaderクラスで読み込む
【JDK1.1以降】
テキストファイル読み込みの基本クラスとなるのが FileReader クラスです。
■コンストラクタ
コンストラクタ | 説明 |
FileReader(String fileName) |
ファイルパス(fileName)からFileReaderオブジェクトを作成します。
|
FileReader(File file) |
FileオブジェクトからFileWriterオブジェクトを作成します。
|
■FileReader主要メソッド
メソッド | 戻り値 | 説明 |
read() |
int
|
ストリームから文字を一文字づつ読み込みます。
読み込んだ値は文字コードを表す整数(int型)で返します。
ストリームの終わりに達した場合は -1 を返します。
|
close() |
void
|
ストリームを閉じて、それに関連するすべてのシステムリソースを解放します。
|
※コンストラクタやメソッドの詳細は公式の API リファレンスを確認ください。
FileReader クラスでファイルを読み込む場合は、まず、引数に File オブジェクトまたはファイルパス(文字列)を指定して FileReader オブジェクトを生成します。
File file = new File("c:\\tmp\\sample.txt"); // Fileオブジェクトの生成
FileReader fr = new FileReader(file); // FileReaderオブジェクトの生成
ファイルの読み込みは、その生成したオブジェクトの read メソッドを使用して行います。read メソッドは一文字づつ読み込むため、通常はループ処理でファイルの終わりまで読み込みます。また、このメソッドは読み込んだ値を文字コード(int型)で返すため、文字として使用する場合は値を文字型にキャストする必要があります。
int ch;
while((ch = fr.read()) != -1){ // ループ読み込み
System.out.print((char)ch); // 文字型にキャストして表示
}
ループ処理でファイルを読み込む際、read メソッドはストリームの終わりまで来ると「-1」を返すため、その特性を利用してループを抜けます。なお、FileReader オブジェクトを生成する際に、該当のファイルが存在しなかったり、アクセスできなかったりした場合は、FileNotFoundException が発生します。また、読み込みの際に読み込みに失敗した場合などは IOException が発生するため、それぞれの例外に対しての例外処理を行う必要があります。
【サンプルコード1】
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
class Sample1 {
public static void main(String[] args) {
try{
//出力先ファイルのFileオブジェクトを作成
File file = new File("c:\\tmp\\sample.txt");
//FileReaderオブジェクトを作成
FileReader fr = new FileReader(file);
//ファイルの読み込み
int ch;
while((ch = fr.read()) != -1){
System.out.print((char)ch);
}
//FileReaderオブジェクトをクローズ
fr.close();
} catch(FileNotFoundException e) {
System.out.println(e);
} catch(IOException e) {
System.out.println(e);
}
}
}
※上記例はファイル「c:\tmp\sample.txt」を読み込み、標準出力に表示しています。
■特記事項
- 一般的に、FileReader や InputStreamReader などの Reader から直接 read メソッドを呼び出した場合、その要求は直ちにストリームに対して発行されるため、アクセスの面では非常に効率が悪く、通常は BufferedReader クラスなどを使用してバッファリングすることが推奨されています。
- FileReader には文字コードを指定して読み込む機能はありません。
BufferedReaderクラスで書き込む
【JDK1.1以降】
読み込む文字をバッファリングすることによって、入力ストリームから効率良くテキストを読み込むクラスです。
■コンストラクタ
クラス | 説明 |
BufferedReader(Reader in) |
Readerオブジェクトから文字型入力ストリームを作成します。
|
■BufferedReader主要メソッド
メソッド | 戻り値 | 説明 |
readLine() |
String
|
テキストを一行読み込みます。
ストリームが終わりの場合はnullを返します。
一行の終わりは、改行「\n」か、復帰「\r」、または復行とそれに続く改行のいずれかで認識されます。
|
close() |
void
|
ストリームを閉じて、それに関連するすべてのシステムリソースを解放します。
|
※コンストラクタやメソッドの詳細は公式の API リファレンスを確認ください。
通常、Reader(FileReader や InputStreamReader など)は呼び出しがあった場合、ただちにストリームに対してその要求を発行しますが、一般的にファイルなどのストリームアクセスは低速なため、Reader から直接、読み込みメソッドを呼び出す方法は非効率的と言われています。そこで使用されるのが BufferedReader になります。このクラスは読み込む文字をバッファリングすることにより、入力ストリームから効率良くテキストを読み込むことができます。
【サンプルコード2】
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
class Sample2 {
public static void main(String[] args) {
try{
//出力先ファイルのFileオブジェクトを作成
File file = new File("c:\\tmp\\sample2.txt");
//BufferedReaderオブジェクトを作成
BufferedReader br = new BufferedReader(new FileReader(file));
//ファイルの読み込み
String str = null;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
//FileWriterオブジェクトをクローズ
br.close();
} catch(FileNotFoundException e) {
System.out.println(e);
} catch(IOException e) {
System.out.println(e);
}
}
}
※上記例はファイル「c:\tmp\sample2.txt」を一行ごと読み込み、標準出力に表示しています。