StreamReader.Read 和 StreamReader.ReadBlock 之间的区别

Posted

技术标签:

【中文标题】StreamReader.Read 和 StreamReader.ReadBlock 之间的区别【英文标题】:Difference between StreamReader.Read and StreamReader.ReadBlock 【发布时间】:2010-10-10 04:27:32 【问题描述】:

文档只是说 ReadBlock 是

“Read 的阻塞版本”

但这是什么意思?

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

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

回答的人说

基本上,这意味着您可以不依赖 StreamReader.ReadBlock 返回,直到它的阅读量达到您的要求,或者 它已到达流的末尾。

我是否正确理解这是必需的,因为 Read 可能无法为您提供您所要求的一切?仅仅因为它返回 0 并不意味着你到达了文件的末尾?

所以这意味着检查返回的字节数以外的其他内容(EndOfStream?)或使用 ReadBlock 代替?

【问题讨论】:

另见c# - When to use StreamReader.ReadBlock()? - Stack Overflow。 【参考方案1】:

ReadBlock 并不意味着它是线程安全的。如果您使用 Reflector 查看 StreamReader.ReadBlock(继承自 TextReader.ReadBlock)的实现,它所做的只是多次调用“Read”方法,直到“Read”方法返回 0 或我们读为请求的许多字节。这是必需的,因为“读取”方法不一定会返回您要求的那么多字节。

【讨论】:

如果 ReadBlock 只是推迟到 Read 直到 Read 返回 0,如果 Read 返回 0 但没有到达流的末尾会发生什么?或者那是不可能的?如果 Read only 返回准备好的内容,我会认为理论上可能随时返回 0?还是说错了? @J M:返回 0 总是表示到达了流的末尾,所以 Read 实际上也是阻塞的,直到它收到 something 啊——那就是最后一首了。读取块直到它至少有一些东西,并且 ReadBlock 块直到它得到你要求的所有东西或者它到达文件的末尾。无论哪种方式,0 表示文件结束。太好了,谢谢。 啊……ReadBlock 中的“block”一词是指阻塞的动作,而不是下一个“block”字节。 不要学究气,但 TextReader 用于读取字符,而不是字节。字节数可能等于也可能不等于字符数,具体取决于编码。

以上是关于StreamReader.Read 和 StreamReader.ReadBlock 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

HTTPWebResponse + StreamReader 非常慢

C# Stream.Read 超时

Py4JJavaError:调用 o45.load 时出错。 :java.lang.NoClassDefFoundError:org/apache/spark/sql/sources/v2/Strea

带有流的文件 I/O - 最佳内存缓冲区大小

Lambda学习---方法引用和其他基本应用

FileStream 与/差异 StreamWriter?