Javaのファイル読み込み、書き込みを整理 その1

Javaのファイル読み込み、書き込みに関する知識がごちゃごちゃしているので整理してみました。
誤解している箇所もあると思いますので、指摘してもらえると助かります。

目的

  • Javaのファイル読み込み、書き込みの機能を体系付けて分類する。
  • 使い方を整理する。

分類

Javaのファイル読み込み、書き込み機能は大雑把に4種類に分類されます。
分類の要素は

  • 対象(多くはファイル)がテキスト形式かバイナリ形式か
  • 対象への操作(読み、書き)

の2つで、下記のようになります。

テキスト バイナリ
Reader InputStream
Writer OutputStream

今回はこれらのうち、テキスト形式を取り扱う「Reader」を整理してみます。

Readerの階層構造

テキストを読み込む機能は、Readerクラスを頂点として下記のような階層構造になっています。

色々ありますが、

の2つの利用頻度が多いと思われます。

FileReaderとInputStreamReader

FileReaderと同じファイル読み込み機能を持つものにInputStreamReaderがあります。

これらの2つの違いは、

  • InputStreamReaderは文字コードを指定できるが、FileReaderは実行環境のデフォルト文字コードを利用する。
  • InputStreamReaderはバイナリとテキストの橋渡しをするのが本来の役割。なので、ファイルの読み込み以外にも利用できる。

です。

使い方(テキストファイルの読み込み)

InputStreamReader, FileReaderそれぞれを利用してテキストファイルを利用する場合は、以下の手順が必要になります。

InputStreamReaderはバイナリの橋渡しする分一手間かかります。
また、いずれの場合も効率良くファイルを読み込むためにBufferedReaderに集約します。

コードにすると、
InputStreamReaderの場合

FileInputStream fs = new FileInpustStream("hoge.txt");
InputStreamReader isr = new InputStreamReader(fs, "UTF8");
BufferedReader br = new BufferedReader(isr);

FileReaderの場合

FileReader fr = new FileReader("hoge.txt");
BufferedReader br = new BufferedReader(fr);

となります。
文字コードを意識する必要がない場合はFileReaderを利用するのが楽ですね。

BufferedReaderを作成した後はテキストを読み取ります。

FileReader fr = new FileReader("hoge.txt");
BufferedReader br = new BufferedReader(fr);

//char配列として読み取る。
char[] buffer = new char[1024];
br.read(buffer, 0, 1024);

//Stringとして一行ずつ読み取る。
StringBuffer text = new StringBuffer(1024);
String line;
String lineSeparator = System.getProperty("line.separator");
while( (line = br.readLine()) != null) {
    text.append(line);
    text.append(lineSeparator);
}

Readerに関してはこんなところでしょうか。

参考

Java〓 Platform, Standard Edition 7 API Specification
http://docs.oracle.com/javase/7/docs/api/index.html