• ベストアンサー

ストリームについて

ストリームが良く分かっていないのですが。 (現在の知識としては、バイトデータのようなデータ項目の流れ)という曖昧なイメージのままなのですが・・・ javaでストリームが必要な時とはどのような場合ですか? もしこれが無かった場合、データの入出力に当たってどのような不都合が生じるのでしょうか? またどうして、ストリームはバイト単位でデータを取り扱うのですか? (どうしてビット単位ではないのでしょうか?)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ストリームがないとデータは取り出せません。ストリームというかバッファですか?バッファがなくてもデータは取れますが、HDDのIOなどの問題でデータが連続的(スムーズ)に取り出せない場合のクッションの役割としてバッファが存在します。 バイト単位なのはコンピュータの構造の問題です。ビット単位でデータを扱うことはできますが、バイト単位でデータを扱うことを前提にコンピュータは設計されているので、処理上無駄が多くなってしまうのです。

Guno-this
質問者

お礼

ありがとうございます。 ストリームの存在意義がわかってきた気がします。 もしよろければ、 そこから少し突っ込んだご回答の方いただきたいのですが・・・ 【ストリームについて】 >ストリームがないとデータは取り出せません。 データが取り出せないというのは「HDDのファイルから」になるのでしょうか? HDDのデータ入出力には、「クッション(仲介役)」がなければ、連続的にすることができないということですよね・・・? (違ったらすみません汗) 例えば次のようなデータがあったとき、 ●ストリームがある場合 -------------------------------------------------------------- 一度バッファ?に溜め込むことで、連続して出力が可能 Stream.txt  10000000 11000000 11100000  ⇒  10000000 11000000 11100000    ・全バイト情報のインプット → 全バイト情報のアウトプットが可能 -------------------------------------------------------------- ●ストリームがない場合 -------------------------------------------------------------- ひとつひとつファイルにアクセスしなければならない? Stream.txt   [10000000] 11000000 11100000 ⇒  10000000   10000000 [11000000] 11100000 ⇒  11000000   10000000 11000000 [11100000] ⇒  11100000 ・テキスト中の1バイトをインプット → インプットで得た1バイトを出力 -------------------------------------------------------------- イメージとしてはこのような形でしょうか? 【コンピュータがバイト扱いになっている点について】  バイト単位で扱うようになっているコンピュータの構成については、「ビットでは人が扱いにくすぎる、だからバイトにしよう」的な裏づけがあるのでしょうか?

その他の回答 (3)

  • foxa-gogo
  • ベストアンサー率44% (38/85)
回答No.4

>となると・・・ こういうことでしょうか? >「INPUTからOUTPUTのIOをまとめなかった場合、 >aにはaというIO 、 bにはbというIO CにはCというIO・・・ > と、一つ一つのIOに着目して対応をしていたのでは、手間が掛かるた>め、IO関係はIO関係という括りで取り扱いができるようにした」 >ということでしょうか? >(一つの考えとしてそのためにストリームが産まれたと考えられますでしょうか?) はい、そのとおりだと僕は理解しております。

Guno-this
質問者

お礼

どうも、ありがとうございます。

  • foxa-gogo
  • ベストアンサー率44% (38/85)
回答No.3

追記です。 ちなみにバッファとストリームは違うと思います。バッファを使う場合には、例えばBufferedReaderでラップしたりします。 質問者さんが興味を持っているあたりは、ByteStreamがやっていることですので、その辺から調べていくのもありかもしれません。

Guno-this
質問者

お礼

どうも、ありがとうございます。

  • foxa-gogo
  • ベストアンサー率44% (38/85)
回答No.2

javaの「ストリーム」の位置づけとしては、「いろいろな種類のあるIOを、「ストリーム」という概念で統合してしまい、隠蔽化しよう」という考え方だと思います。つまり分類としては高水準の話ですね。 ですから、ストリームといっても、ネットワークからデータの流れがある場合もあるし、ファイルから読むこともあるでしょう。しかし、いろいろなIOをまとめてストリームという概念で扱うので、プログラムの再利用性が高まるのです。 つまり、最初はディスクから情報を取得するクラスとして書いておいて、ネットワークから情報を取得するよう改造するときに非常に楽になる、というようなものです。 質問者さんはかなり低水準のことに興味を持っておられるようなので、ストリームにこだわらすIOについて勉強したり、JavaのIO周りのクラスのソースをご覧になったらいかがでしょうか。この場合は、先に少しデコレータパターンというものをちらっと勉強しておけば、見通しがききやすいかなと思います。お勧めとしては、thinking in javaがあります(ネットで検索してみてください。無料のjava本です。IOの項にかなりいい説明があります)

Guno-this
質問者

お礼

ありがとうございます。 >ネットワークからデータの流れがある場合もあるし、ファイルから読むこともあるでしょう。しかし、いろいろなIOをまとめてストリームという概念で扱うので、プログラムの再利用性が高まるのです。 となると・・・ こういうことでしょうか? 「INPUTからOUTPUTのIOをまとめなかった場合、 aにはaというIO 、 bにはbというIO CにはCというIO・・・  と、一つ一つのIOに着目して対応をしていたのでは、手間が掛かるため、IO関係はIO関係という括りで取り扱いができるようにした」 ということでしょうか? (一つの考えとしてそのためにストリームが産まれたと考えられますでしょうか?) 低水準について興味がでてきましたので、勉強していけたらいいなと思います。

関連するQ&A