如果我正在读取的字节不存在,BinaryReader会怎么做?

Dar*_*dro 8 .net c# networking binaryreader

我在NetworkStream上使用BinaryReader从网络中读取数据.这对我来说非常有用,但我想了解幕后发生了什么,所以我看了一下BinaryReader的文档,发现它非常稀疏.

我的问题是:BinaryReader.ReadBytes(bufferSize)如果bufferSize我打电话时网络流上没有字节会怎么办ReadBytes

在我看来,有几个选项:
1)读取网络流上存在的任何字节,只返回那么多
2)等待直到bufferSize流上出现字节,然后读取
3)抛出异常

我假设选项2正在发生,因为我从未收到任何例外,我的所有数据都是全部收到的,而不是碎片.但是,我想知道发生了什么.如果有人能够启发我,我将不胜感激.

Jon*_*eet 11

我相信它实际上是隐藏的选项4:

  • 在数据变得可用时读取数据,以与通常手动相同的方式循环.如果它在读取时到达流的末尾,它将仅返回一个小于您要求的字节数的值.

这与您的选项2略有不同,因为它在数据可用时耗尽流 - 它不会等到它可以一次读取所有数据.

很容易证明它确实返回的字节数少于你要求的字节数,如果它到达结尾:

var ms = new MemoryStream(new byte[10]);
var readData = new BinaryReader(ms).ReadBytes(100);
Console.WriteLine(readData.Length); // 10
Run Code Online (Sandbox Code Playgroud)

如果没有自定义流明确需要多次Read调用来返回所有数据,那么很难证明循环部分.

文档不是很清晰,但返回值部分至少有些帮助:

包含从基础流读取的数据的字节数组.这可能小于达到流末尾时请求的字节数.

请注意我突出显示的最后一部分,并将其与Stream.Read以下内容进行比较:

读入缓冲区的总字节数.如果当前没有多个字节可用,这可能小于请求的字节数,如果已到达流的末尾,则可以小于零(0).

如果您期望获得确切数量的数据并且只有该数量有用,我建议您编写一个ReadExactly方法,如果您需要的数据比关闭之前提供的数据流更多,则会调用Read和抛出EndOfStreamException.