Readメソッドで実際に読み込むことができたデータの長さは、戻り値によって知ることができます。 Streamから読み込めるデータが無くなった場合(すでにストリームの終端に達している場合)は、戻り値として0が返されます。 Readメソッドでの読み込みが成功した場合、読み込めたバイト数だけストリームの現在位置(Position)が移動します。

次の例は、用意したバッファがいっぱいになるまでReadメソッドで読み込みを行う例です。 このコードでは用意したバッファがいっぱいになるか、ストリームの終端に達するまで読み込みを続けます。

Readメソッドを使ってバッファがいっぱいになるか終端に達するまでStreamからデータを読み込む
using System;
using System.IO;

class Sample {
  static void Main()
  {
    using (var stream = File.OpenRead("sample.dat")) {
      var buffer = new byte[16];    // 読み込んだデータを格納するためのバッファ
      var offset = 0;               // 読み込んだデータを格納する位置の初期値
      var count = buffer.Length;    // 読み込むバイト数の初期値

      for (;;) {
        // 最大countバイト読み込み、bufferのインデックスoffset以降に格納する
        int len = stream.Read(buffer, offset, count);

        if (len == 0) {
          break; // これ以上読み込めるデータが無いので、読み込みを終了する
        }
        else {
          offset += len;  // 読み込めた長さの分だけ、次回のReadでバッファに格納する位置を移動する
          count -= len;   // 読み込めた長さの分だけ、次回のReadで読み込むバイト数を減らす
        }
      }

      // 実際に読み込めた分を表示する
      Console.WriteLine(BitConverter.ToString(buffer, 0, offset));
    }
  }
}