缓冲流如何工作?

Vor*_*326 8 c# java buffer encapsulation stream

在Java和C#中,有几个用于缓冲流的类: BufferedStream在C#Buffered(Input|Output)StreamBuffered(Reader|Writer).

他们在构造函数中获取一些流并实现相同的接口.

问题是 - 它是如何工作的?

当我试图读取一个字节时会发生什么?它将大量字节读入内部缓冲区,然后逐字节地将其返回给我?在写一个字节?写入内部缓冲区并将其flush()写入内部流?

关于读/写一个字节数组 - 在缓冲流上执行它是否效率低导致从内部数组中双重复制字节?

Rob*_*vey 3

它读取大量字节到内部缓冲区,然后一个字节一个字节地返回给我?

基本上,是的。从磁盘盘或 TCP 流请求数据需要时间,因此一次获取整个字节块比尝试从源单独检索它们会更有效。

  • 如果您的数据源有一些请求开销,并且您想要限制请求数量,则缓冲流非常有用。硬盘驱动器完全旋转一周大约需要 1/120 秒,因此如果您从中逐个字符检索 120 个字符,在最坏的情况下可能需要整整一秒。但如果您一次检索所有 120 个字符,则可以在一次循环中完成。当然,您可以创建自己的缓冲区,但为什么要重新发明轮子呢? (2认同)
  • 请注意,.NET 中的 FileStream 已经有足够的缓冲来与硬盘一起使用。如果您从套接字或类似的东西读取 TCP 数据包,则只需要“BufferedStream”。 (2认同)