私は、Bufferが一連のバイトであることを読みました。しかし、Streamも一連のバイトであることも読みました。ストリームとバッファの違いは何ですか?
コメントで述べたように、バッファとストリームの簡単な違いは、ストリームは指定されたソースとの間で情報を転送するシーケンスであり、バッファはメモリに格納されるバイトのシーケンスであることです。例えば:
FileStream stream = new FileStream("filepath.txt", FileMode.OpenOrCreate);
ファイルへのストリームを開きます。そのストリームは、読み取り、書き込み、またはその両方が可能です。追加のメモリを必要としないため、軽量で高速ですが、ソース内の特定のデータセットを任意に参照するのは面倒です。ストリームは、個別のデータセットではなく接続であることからもメリットがあるため、データのサイズを事前に知っておく必要はありません。
逆に:
byte[] fileContents = File.ReadAllBytes("filepath.txt");
ファイルのすべてのバイトをメモリに読み込みます。これは、ファイル全体を一度に操作する必要がある場合や、プログラムが保持する「ローカルコピー」を保持してファイルを他の用途に解放できるようにする場合に便利です。ただし、ソースのサイズと使用可能なメモリの量によっては、entireファイルを含むバッファがオプションにならない場合があります。
ただし、これは必要最低限の説明です。たとえば、 Marc Gravellによると のように、より徹底的なものがあります。
多くのデータ構造(リスト、コレクションなど)はコンテナとして機能し、オブジェクトのセットを保持します。しかし、ストリームではありません。リストがバケットの場合、ストリームはホースです。ストリームからデータをプルしたり、データをストリームにプッシュしたりすることができますが、通常は1回だけで、一方向のみです(もちろん例外はあります)。たとえば、TCPネットワーク上のデータはストリームです。データのチャンクを送信(または受信)できますが、他のコンピュータとの接続でのみ、通常は1回だけです-できません。インターネットを巻き戻します。
ストリームは、ストリームを通過するデータを操作することもできます。圧縮ストリーム、暗号化ストリームなど。ただし、ここでも、基礎となるメタファーはデータのホースです。ファイルは、通常、ストリームとして(あるレベルで)アクセスされます。順次データのブロックにアクセスできます。もちろん、ほとんどのファイルシステムはランダムアクセスも提供するため、ストリームはSeek、Position、Lengthなどの機能を提供しますが、すべての実装がそのような機能をサポートしているわけではありません。ストリームを探したり、開いているソケットの長さを取得したりする意味はありません。
バッファは指定されたサイズ/長さを持ち、データを格納するために使用されます。一方、ストリームは、ある場所から別の場所へ情報を読み書きするために使用されます。たとえば、FileStream
は、ファイルの読み書きに使用され、ストリーム自体にバッファがあり、その最大サイズに達するとバッファがフラッシュされ、ストリーム内のデータが読み書きされます。