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 非常慢
Py4JJavaError:调用 o45.load 时出错。 :java.lang.NoClassDefFoundError:org/apache/spark/sql/sources/v2/Strea