Streamの扱いまとめ

■InputStreamReader
バイトストリームを読み込んで文字列にする。(文字コードの指定ができる)。オブジェクトをreadすると最初の一文字分のアスキーコードがintで返ってくる。
new InputStreamReader(バイナリ文字列, "SJIS");
■FileInputStream
ファイルをバイナリデータとして読み込む
new FileInputStream("file.txt");
このオブジェクトを直接BufferedReaderに放り込むことはできない。(コンパイルエラーになる)。でも、System.out.printで直接出力するとInputStreamReaderと同様一文字目のアスキーコードが返ってくる。
よくわからないけど、FileInputStreamとInputStreamReaderは中身を読んでみると同じみたいだけどスーパークラスが違うみたいでオブジェクトを引数として使える場合と使えない場合がある。

Shift_JISのファイルをバッファに読み込む場合↓
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("ファイル名"), "Shift_JIS"));

InputStreamReaderとFileInputStreamを合体させたのが、
■FileReader
ファイルを文字列として読み込む。文字コードは指定できない。(システムデフォルト文字コードを常に使用する)
new FileReader();で作られるオブジェクトはおそらくファイルの内容をメモリに収めたアドレスが収められている。
内容を読み出すのはFileReader.read()のメソッドになる。
readメソッドはファイルの内容をint(asciiコードの10進数)で一文字分ずつ読みだす。

■DataInputStream
Javaの基本データ型を指定してデータをやりとりする。readChaとかreadIntとかいう具合。データ型を指定することでOSなんかに影響されないというのがメリットみたい。

                          • -

【別記】
もともとInputStreamとOutputStreamがあった。
「ファイル」や「メモリ」「ソケット」など、対象はいろいろあるけれどデータの書き込みと読み込みを行う場合に発生する経路をざっくりとstreamという概念で定義した。
InputStreamとOutputStreamはこのStreamを扱う一番基本のクラス。抽象クラスだと思う。
扱えるデータはbyte。たぶん「0」と「1」をそのままやったりとったりするという動作をする。

このバイトデータそのままでは扱いにくいので、DataInputStreamとDataOutputStreamというサブクラスができた。これはintとかdoubleとかプリミティブなデータ型でstreamを扱えるというもの。

ここまででは文字列が扱えないということでInputStreamReaderとOutputStreamReader、InputStreamWriterとOutputStreamWriterという「文字列」を扱えるサブクラスができあがった。これが結構革命的。Reader、Writerがついてるクラスがでてきてすげえ便利になった。

さらにこの文字列Streamを効率的に扱いたいという、あくなき欲求からBufferにStreamを格納しちゃおうじゃないかという発想がでてきて実装されたわけ。これでストリームを行単位で扱えるようになった。

Streamを理解する上では、
「バイトストリーム」→「プリミティブ型ストリーム」→「文字列ストリーム」→「バッファードストリーム」という進化の過程をイメージすると理解しやすい。