web-dev-qa-db-ja.com

ストリームとはどういう意味ですか?その特徴は何ですか?

C++C#はどちらもWord streamを使用して多くのクラスに名前を付けています。

  • C++iostreamistreamostreamstringstreamostream_iteratoristream_iterator...
  • C#StreamFileStreamMemoryStreamBufferedStream...

ですから、streamはどういう意味ですか? streamの特徴は何ですか?この用語を使用してクラスに名前を付けることができるのはいつですか?これはファイルI/Oクラスのみに限定されますか?

興味深いことに、[〜#〜] c [〜#〜]は、私の知る限り、このWordをどこでも使用していません。

65
Kashif

多くのデータ構造(リスト、コレクションなど)はcontainersとして機能し、オブジェクトのセットを保持します。しかし、ストリームではありません。リストがバケットの場合、ストリームはホースです。ストリームからデータをプルしたり、データをストリームにプッシュしたりできますが、通常は1度だけ一方向のみです(もちろん例外があります)。たとえば、TCPネットワーク上のデータはストリームです。データのチャンクを送信(または受信)できますが、他のコンピュータとの接続でのみ、通常は1回だけです-できません。インターネットを巻き戻します。

ストリームは、ストリームを通過するデータを操作することもできます。圧縮ストリーム、暗号化ストリームなど。ただし、ここでも、基礎となるメタファーはデータのホースです。ファイルは、通常、ストリームとして(あるレベルで)アクセスされます。順次データのブロックにアクセスできます。もちろん、ほとんどのファイルシステムはランダムアクセスも提供するため、ストリームはSeek、Position、Lengthなどの機能を提供しますが、すべての実装がそのような機能をサポートしているわけではありません。ストリームを探したり、開いているソケットの長さを取得したりする意味はありません。

74
Marc Gravell

From I/O Streams (Javaでは、意味はC++/C#でも同じです)

I/Oストリームは、入力ソースまたは出力宛先を表します。ストリームは、ディスクファイル、デバイス、他のプログラム、メモリアレイなど、さまざまな種類のソースと宛先を表すことができます。

ストリームは、単純なバイト、プリミティブデータタイプ、ローカライズされた文字、オブジェクトなど、さまざまな種類のデータをサポートします。一部のストリームは単純にデータを渡します。他のユーザーは、便利な方法でデータを操作および変換します。

内部でどのように機能するかに関係なく、すべてのストリームは、それらを使用するプログラムに同じ単純なモデルを提供します。プログラムは、入力ストリームを使用して、一度に1項目ずつソースからデータを読み取ります。

C#では、言及したストリームは、抽象基本クラス Stream から派生します。この基本クラスの各実装には特定の目的があります。

たとえば、 FileStream はファイルの読み取り/書き込み操作をサポートしますが、 MemoryStream はメモリ内ストリームオブジェクトで機能します。 FileStreamおよびMemoryStreamクラスとは異なり、 BufferedStream クラスでは、ユーザーがI/Oをバッファリングできます。

上記のクラスに加えて、Streamクラスを実装する他のクラスがいくつかあります。完全なリストについては、Streamクラスの MSDNドキュメント を参照してください。

4

いくつかの異なる意味があります。 #1はあなたがおそらく意味していることですが、#2も見てみたいかもしれません。

  1. あなたが言及したようなライブラリでは、「ストリーム」は「バイナリデータ」の単なる抽象概念であり、ランダムアクセスである場合とそうでない場合があります(ストリームを書き込んでいる場合など、継続的に生成されるデータとは対照的)生成されたランダムデータ)、またはそれが保存される場合がありますanywhere(RAM、ハードディスク、ネットワーク経由、ユーザーの脳内など)。詳細を回避し、ストリームの特定のソースを気にしない一般的なコードを記述できるので便利です。

  2. より一般的なコンピューターサイエンスの概念として、「ストリーム」は(大まかに)「有限または無限のデータ量」と見なされることがあります。概念は例なしでは説明するのが少し難しいですが、(Schemeのような)関数型プログラミングでは、オブジェクトの履歴を変更の「ストリーム」として扱うことで、オブジェクトを状態のないオブジェクトに変えることができます。 (オブジェクトの状態は時間の経過とともに変化する可能性があるという考えですが、オブジェクトの全寿命を変更の「ストリーム」として扱う場合、ストリーム全体は決して変更されず、関数プログラミングを実行できます。)

4
Mehrdad

公式用語と説明はさておき、単語stream自体は「実生活」から取られました stream -水ではなく、データある場所から別の場所に転送されます。

あなたが尋ねた質問についてはまだ回答されていませんでしたが、ストリームを含む名前で独自のクラスに名前を付けることができますが、何らかの新しいストリームを実装する場合にのみ、それは正しい意味を持ちます。

2
Shadow Wizard

Cでは、<stdio.h>で定義された関数がストリームを操作します。

セクション7.19.2Streamsin C99 は、「順序付けられたシーケンス文字」。

rationale は、対応するセクションでより多くのコンテキストを提供します。

Cは、テキストストリームの概念を、それが生まれたUNIX環境から継承しました。

そこでコンセプトが生まれました。

1
aaz