質問: Wrtiterにも同じ疑問を感じているのですが、 JavaのReaderクラスについて、Javadocには > > 文字ストリームを読み込むための abstract クラスです。 > > () > > > と書かれていますが、Readerを継承しているStringReaderクラスについては、 > > ソースが文字列の文字ストリームです。 > > () > > > と書かれていますが、Reader関係のクラスは、ストリームその物なのでしょうか? それともストリームを読み込むための物なのでしょうか? 皆さんは、どのように捉えられているのでしょうか?お教えてください。
回答: `Reader`や`Writer`は例えばファイルの読み書きに用いられますが、一般のプログラムが直接HDDを操作してファイルを取り出すことはありません。ファイルシステムはOSの制御にあります。 ですので、ファイルをオープンしたとき、実際には以下のような流れがあります。 * OSのファイル読み出しの命令を呼び出す * OSがドライバソフトウェアを用いてハードウェアを操作する * ファイル実体のバイト列が得られる * OSからバイト列が返却される このようなIOで受け渡されるバイトの流れのことを、ストリームと呼びます。この概念を抽象化したのが`InputStream`になります。 ファイルを例に取りましたが、実体となるストリームのソースは通信であったり、ハードディスクであったり、メモリだったりします。`InputStream`そのものは「バイト列を1バイトずつ扱う」ことを定めたインターフェースとなります。 ここで、もし入力がテキストだと分かっているのであれば、エンコードしながら一文字ずつ読み込んだ方が便利ですよね。「文字列のストリームを1文字ずつ扱う」ことを定めたインターフェースが`Reader`です。`Reader`も`InputStream`同様、実体が何かは知りません。 `StringReader`はJavaプログラム上の文字列を「入力ストリーム」として扱いたい場合に利用します。実体(ソース)は`String`インスタンスです。こちらはインターフェースではなく実装になりますね。 「*ソースが文字列の文字ストリームです。*」という日本語だと分かりにくいですが、 1. 1バイトずつ読み込む「ストリーム」と、1文字ずつ読み込む「文字ストリーム」の2種類が区別されている。 2. 「ストリームからどう読み込むか」のインターフェースと、「何のストリームからどう読み込むか」の実装がある。 3. ソースが`String`(文字列)の`StringReader`(文字ストリームを扱う実装)がある。 と順を追って考えると分かりやすいのではないでしょうか。 > > Reader関係のクラスは、ストリームその物なのでしょうか? > > それともストリームを読み込むための物なのでしょうか? > > > という質問に対しては、「ストリームを読み込むためのもの」という答えになります。