缓冲流如何工作?

Posted

技术标签:

【中文标题】缓冲流如何工作?【英文标题】:How Buffered Streams works? 【发布时间】:2013-05-12 20:24:50 【问题描述】:

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

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

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

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

关于读取/写入字节数组 - 在缓冲流上执行此操作是否会导致将字节双重复制到内部数组中或从内部数组中复制出来?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

因此,如果我正在读取大量字节并且想要逐字节读取它们,而不是考虑读入缓冲区,那么缓冲流很有用?如果我想手动将一个字节数组读入我的缓冲区,这没用吗? 如果您的数据源有一些请求开销,并且您想限制请求的数量,则缓冲流很有用。硬盘驱动器完全旋转大约需要 1/120 秒,因此如果您逐个字符地从中检索 120 个字符,在最坏的情况下可能需要一整秒。但是,如果您一次检索所有 120 个字符,则可以在一次旋转中完成。当然,您可以创建自己的缓冲区,但为什么要重新发明***呢? 请注意,.NET 中的 FileStream 已经足够缓冲,可以与硬盘一起使用。如果您正在从套接字读取 TCP 数据包或类似的东西,则只需要 BufferedStream 只是要明确一点:这是一个临时缓冲区,实际上并没有捕获流。

以上是关于缓冲流如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何高效的使用IO流?字节流字符流缓冲流序列化对象流打印流全整理

JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine

Java IO流 - 缓冲流的详细使用介绍

Java IO流 - 缓冲流的详细使用介绍

缓冲流

缓冲流之字节缓冲流