BinaryReader的FillBuffer方法是做什么用的?

3
根据文档

从流中读取指定数量的字节并填充内部缓冲区。

这是什么意思(什么是内部缓冲区)?
3个回答

0
< p > BinaryReader 具有内部缓冲区,因此它不需要在底层流上执行太多的小读取操作,特别是在读取可能需要一些前瞻的字符数据时。您不应该手动调用此函数。


2
所以我在想为什么它是受保护的而不是私有的。 - Alofons
1
你并不孤单:http://www.pcreview.co.uk/forums/thread-1225604.php - 我猜他们最初想要让它更容易扩展,然后停了一半或者没有撤销所有的东西。 - Lucero

0

请注意该方法被声明为受保护的。

因此,只有在您想要创建一个继承自BinaryReader的类时才会感兴趣,而这种情况很少发生。


但即使如此,它也相当无用,因为您无法控制内部缓冲区,即使覆盖该方法也是如此。我同意Alofons的看法。 - Lucero
我同意,这没有太多意义。我认为在读取由许多较小部分组成的大对象之前能够调用此函数可能会很有用,通过确保在读取对象的一半时不必填充缓冲区,因此您可以预加载缓冲区。但是,正如您所说,您无法控制缓冲区的大小或任何其他内容,因此最有可能这是某人认为该类应该是可扩展的产物,然后未完成工作。 - Lasse V. Karlsen

0

看起来这里的主要目的是让您有一种方便的方法来确保您在本地拥有一块数据块;例如,当读取“double”时,您通常需要8个字节。该方法包装了以下内容:

  • 检查内部缓冲区是否已经足够
  • 根据需要循环执行“Read”
  • 检查EOF(并出错)
  • 防止溢出
  • 处理缓冲区管理,例如定期反向块复制数据或处理循环缓冲区的各种索引

然而,除非您正在读取小的'byte[]',否则似乎不太可能需要在外部调用它

至于内部缓冲区;简单地说,在反序列化时:

  • 希望将对“Read”的调用最小化
  • 通常需要预先查看超过1个字节(没有缓冲区很棘手)
  • 经常需要使用小的'byte[]'进行操作(例如通过BitConverter)

所以只需工作即可。


我知道这是一个有点老旧的帖子,但你能详细解释一下你在最后一个列表中的意思吗?我正在编写一个EndianAwareBinaryReader,并经常在其中调用BitConverter。请参见我在此MSDN论坛中的实现。 - Scott Chamberlain
@Scott,你知道,在BitConverter中byte[]很普遍。我想说的是:尽量减少这些分配是很好的。实际上,在我的序列化器中,我尝试避免使用BitConverter,而是使用移位等组合来实现大小端安全性和缓冲区分配的避免。 - Marc Gravell

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