TextReader上的Read()和ReadBlock()调用有什么区别?

时间:2012-05-08 11:19:11

标签: c# stream streamreader textreader

标题或多或少说明了一切。电话记录在案:

TextReader.Read Method (Char[], Int32, Int32)的{​​p> Here
对于具有相同参数类型的TextReader.ReadBlock()Here

我想提取一个字节数组的一部分,为此构成一个MemoryStream,我打算用StreamReader读取,如下所示:

    StreamReader r = new StreamReader(new MemoryStream(rawData, 0, 184, false, false));
    r.Read.....

我应该使用哪一个?其中一个更快还是更好?

1 个答案:

答案 0 :(得分:5)

如果您可以使用部分结果执行某些有用的操作,请调用Read()并处理您获得的内容。特别是如果你循环并处理每个Read()的结果然后执行此操作而不是使用ReadBlock()。

ReadBlock中的“块”一词是指阻塞的动作,而不是下一个“块”的字节。所以它会强制停止进一步执行直到它完成。

如果使用Reflector查看StreamReader.ReadBlock(继承自TextReader.ReadBlock)的实现,它所做的就是多次调用“Read”方法,直到“Read”方法返回0或者我们已读取所请求的字节数。这是必需的,因为“Read”方法不一定会返回您要求的字节数。