StreamReader.Read和StreamReader.ReadBlock的区别

34

这份文档简单地说,ReadBlock 是 Read 的阻塞版本,

但是这意味着什么呢?

之前有人问过这个问题,但是嗯?

http://www.pcreview.co.uk/forums/thread-1385785.php

回答者说:

基本上,这意味着你可以依赖 StreamReader.ReadBlock 直到读取了与你请求的一样多的数据或者到达流的末尾时才返回。

我的理解正确吗 - 这是因为 Read 可能不会返回你请求的所有内容?而且即使它返回 0,也并不意味着你已经到达文件结尾?

所以这意味着需要检查除了返回的字节数之外的其他东西(EndOfStream?)或者使用 ReadBlock 代替 Read?


另请参见[c# - 何时使用StreamReader.ReadBlock()?- Stack Overflow](https://dev59.com/XG865IYBdhLWcg3wceNU)。 - Sam Hobbs
1个回答

36

ReadBlock并不意味着它是线程安全的。如果您使用Reflector查看StreamReader.ReadBlock的实现(它继承自TextReader.ReadBlock),您会发现它只是对“Read”方法进行多次调用,直到“Read”方法返回0或者我们已经读取了请求的字节数为止。这是因为“Read”方法不一定会返回与您请求的字节数相同的字节数。


如果ReadBlock仅仅是将读取操作推迟到Read返回0,那么如果Read返回0但流的末尾尚未到达会发生什么?或者这是不可能的吗?如果Read只返回已准备好的内容,我认为理论上可能在任何时候返回0,这是正确的吗?还是说我错了? - J M
2
@J M:返回0始终表示已到达流的末尾,因此Read实际上也是阻塞的,直到它接收到某些内容 - Wim Coenen
3
啊,那就是最后一块了。读取块直到至少有一些内容,然后读取块直到获取您要求的所有内容或者到达文件结尾。无论哪种方式,0都表示文件结束。非常好,谢谢。 - J M
15
ReadBlock中的“block”一词指的是阻塞操作,而不是下一个“block”字节。 - mattmc3
7
不想显得学究,但TextReader用于读取字符而非字节。字节数量可能与字符数量相等,也可能不相等,这取决于编码方式。 - MarkPflug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接