繁体   English   中英

Double BufferedWriter或BufferedReader的优点

[英]Advantages of Double BufferedWriter or BufferedReader

我知道BufferedWriterBufferedReader 不能直接与文件通信。 它需要包装另一个Writer对象来完成它。 喜欢,

BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("abc.txt"));

这里我们简单地使用BufferedWriter包装FileWriter对象以获得IO性能优势。

但我也可以这样做,

BufferedWriter bufferedWriter = new BufferedWriter(new BufferedWriter(new FileWriter("abc.txt")));

这里使用BufferedWriter包装FileWrite对象,而BufferedWriter又使用另一个BufferedWriter进行包装。 或者更邪恶的想法是将它进一步链接起来。

双BufferedWriter有什么真正的优势吗? 或者进一步链接它? 这同样适用于BufferedReader。

没有好处,没有。

首先,您必须了解缓冲的用途。 当您写入磁盘时,硬盘驱动器需要将磁盘头物理移动到正确的位置,然后等待磁盘旋转,使其位于正确的位置, 然后在磁盘旋转到磁头下方时开始写入字节。 相对而言,前两个步骤比其余操作慢得多。 这意味着有很多固定的开销:写入1000个字节比写入1个字节1000次要快得多。

因此,缓冲只是让应用程序写入字节的一种方式,这种方式对应用程序的逻辑很容易 - 一次一个字节,三个字节,1000个字节,无论如何 - 同时仍然获得磁盘性能。 对缓冲区的大多数写操作实际上不会导致任何字节转到底层输出流; 只有当你达到一定限度(比如说,每1000个字节)时才会写入所有内容。

输入也是一样的想法。

因此,链接这些将无济于事。 对于链,假设它们具有相同的缓冲区大小,您将写入“外部”缓冲区,并且根本不会写入“内部”缓冲区...然后当它达到其限制时,它将刷新所有那些字节到内部缓冲区。 该内部缓冲区立即达到其缓冲区限制(因为它们是相同的限制)并将这些字节直接刷新到输出。 你没有任何好处,但你必须在内存中复制字节一个额外的时间(到字节缓冲区)。

这里的“缓冲”主要反映了接口(API)的语义。 注意到这一点,通过链接BufferedReader组成IO管道是可能的。 通常,考虑在链的末端消耗单个字节可能涉及头部的多次读取,并且理论上和每个API可以简单地基于在头部读取的数据进行计算

对于块设备缓冲的一般情况(例如,从具有块大小的数据传输的IO设备读取,例如FS或网络端点),链接缓冲区(有效队列)肯定会增加内存消耗,立即增加处理延迟(由于增加缓冲区大小(总计)。 它通常会显着提高吞吐量(对延迟产生负面影响)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM