2017-05-12 57 views
1

私はそのバッファがバイトのシーケンスであることを読んだ。しかし私はまた、ストリームもバイトのシーケンスであることを読む。ストリーム&バッファの違いは何ですか?Cでのバッファとストリームの違い#

+0

バッファには指定された一定の長さがありますが、ストリームには指定されていません。 – ThePerplexedOne

+3

ストリームは、読み書きされるバイトのシーケンスです。一方、バッファは、格納されている一連のバイトです。 – Abion47

+1

@ Abion47あなたはバッファがバイトのシーケンスを格納する目的のためだと言ったので、私の質問はストリームがメモリにストアされていないということですか? –

答えて

0

私がコメントしたように、バッファとストリームの違いは、ストリームは情報を指定されたソースとの間でやりとりするシーケンスであり、バッファはメモリに格納されたバイトシーケンスです。例:

FileStream stream = new FileStream("filepath.txt",FileMode.open); 

ストリームをファイルに開きます。そのストリームは、ストリームの読み込み、書き込み、またはその両方を行うことができます。追加メモリを必要としないので、軽量で高速ですが、ソース内の特定のデータセットを任意に参照するのは面倒です。ストリームは、個別のデータセットではなく接続であるという利点もあります。そのため、あらかじめデータのサイズを知る必要はありません。逆

byte[] fileContents = File.ReadAllBytes("filepath.txt"); 

メモリにファイルのすべてのバイトを読み込みます。これは、一度にファイル全体を操作する必要がある場合や、ファイルが他の用途に使用できるようにプログラムを保持する「ローカルコピー」を保持する必要がある場合に便利です。ただし、ソースのサイズと使用可能なメモリの量によっては、のファイル全体がのファイルを含むバッファが選択できない場合があります。

これは単なるベアボーンの説明です。例えば、Marc Gravell puts itとして:

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

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

+0

私はまた、そのストリームは内部バッファを持っていると読んでいます。 –

+0

@neelmaheta一般にストリームには内部バッファがありません。 _特定の種類のストリームがあります。たとえば、 'BufferedStream'や' MemoryStream'などです。 – Abion47

+0

私はすべてのストリームがデフォルトのサイズの内部バッファを持っていることがわかります。あなたはconstructure.Iの値を渡すことによってデフォルトのバッファサイズを変更することができますこれはVisual Studio Express Edition 2013 –

0

バッファは、指定されたサイズ/長さを持ち、データの格納に使用されます。一方のストリームは、ある場所から別の場所へ情報を読み書きするために使用されます。例えば、FileStreamはファイルの読み書きに使用されます。ストリーム自体には、最大サイズまでフィルされたときにバッファされ、ストリーム内のデータが読み書きされるバッファがあります。

関連する問題