ファイル入出力の再勉強

改めて考えると,この辺いつもコピペで済ませているなぁと思い,
APIを改めてザックリと読んでみることにした.
本質は一緒だろうということで,入力部分にフォーカスして勉強.

まずはReaderとInputStreamの違いについて.
Reader (Java Platform SE 6)
InputStream (Java Platform SE 6)

うーん,要するに,
Readerクラスは対象を文字の集合体として認識していて,
InputStreamクラスは対象をbyteの集合体として認識する,
ということだろうか.
テキストファイルの入出力という世界で考えるなら前者を使うわけね.

ただし,両方とも抽象クラスなので,実際に使うのは以下になると.
FileReader (Java Platform SE 6)
FileInputStream (Java Platform SE 6)

さらに,InputStreamとReaderの間の橋渡しとして,
InputStreamReaderという,そのまんまな名称のクラスが用意されている.
InputStreamReader (Java Platform SE 6)

理由はちょっと分からないけれど,読み取りファイルの
文字コード指定は,このInputStreamReaderクラスのコンストラクタにしか
存在しないみたいなので,
こいつのお世話になる機会は多いと思う.

あと,ReaderもInputStreamも,read処理がメチャ重たいので,
下記でラッピングすることで高速化が図れるらしい.
BufferedReaderについてはreadLineメソッドがあるのでさらに便利.
BufferedReader (Java Platform SE 6)
BufferedInputStream (Java Platform SE 6)

以上を踏まえて,次のような呪文が完成するわけだ.

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("sample.txt"), "SJIS"));

流れとしては,

  • ひとまずバイトストリームとしてファイルを取得
  • InputStreamReaderで文字コード指定しつつReader化
  • さらにBufferedReaderでラップすることで処理高速化

みたいな感じ?