20214


Wrtiterにも同じ疑問を感じているのですが、

JavaのReaderクラスについて、Javadocには

> 文字ストリームを読み込むための abstract クラスです。  
>  (<https://docs.oracle.com/javase/jp/6/api/java/io/Reader.html>)

と書かれていますが、Readerを継承しているStringReaderクラスについては、

> ソースが文字列の文字ストリームです。  
>  (<https://docs.oracle.com/javase/jp/6/api/java/io/StringReader.html>)

と書かれていますが、Reader関係のクラスは、ストリームその物なのでしょうか？  
それともストリームを読み込むための物なのでしょうか？

皆さんは、どのように捉えられているのでしょうか？お教えてください。


CC BY-SA 3.0
2015-12-20T08:41:49.560
20209
2015-12-20T10:29:42.467
2015-12-20T09:15:23.173
7290
13747
question
java
Javaの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関係のクラスは、ストリームその物なのでしょうか？  
>  それともストリームを読み込むための物なのでしょうか？

という質問に対しては、「ストリームを読み込むためのもの」という答えになります。


CC BY-SA 3.0
2015-12-20T10:29:42.467
20214
2015-12-20T10:29:42.467
5337
20209
answer