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));
}
}
}