Double BufferedWriter 或 BufferedReader 的优点
Advantages of Double BufferedWriter or BufferedReader
我知道 BufferedWriter
或 BufferedReader
不能直接与文件通信。 它需要包装另一个 Writer
对象才能做它。喜欢,
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("abc.txt"));
这里我们只是使用 BufferedWriter
包装一个 FileWriter
对象以获得 IO 性能优势。
但我也可以这样做,
BufferedWriter bufferedWriter = new BufferedWriter(new BufferedWriter(new FileWriter("abc.txt")));
此处 FileWrite 对象使用 BufferedWriter 包装,而 BufferedWriter 又使用另一个 BufferedWriter 包装。或者更邪恶的想法是将它链接得更远。
double BufferedWriter有什么真正的优势吗?或者进一步链接它?这同样适用于 BufferedReader。
没有任何好处,没有。
首先,您必须了解缓冲的用途。当你写入磁盘时,硬盘驱动器需要物理地将磁头移动到正确的位置,然后等待磁盘旋转到正确的位置,然后然后开始写入磁盘在磁头下旋转时的字节数。相对而言,前两个步骤比其余操作要慢得多。这意味着有很多固定开销:写入 1000 个字节比写入 1 个字节 1000 次要快得多。
因此,缓冲只是一种让应用程序以一种易于应用程序逻辑的方式写入字节的方法——一次一个字节,三个字节,1000 字节,等等——同时仍然获得磁盘性能。大多数对缓冲区的写操作实际上不会导致任何字节进入底层输出流;只有当您达到某个限制(例如,每 1000 字节)后,所有内容才会一次性全部写入。
在输入上也是一样的。
因此,链接这些没有帮助。对于链,假设它们具有相同的缓冲区大小,您将写入 "outer" 缓冲区,而它根本不会写入 "inner" 缓冲区......然后当它达到其限制时,它会将所有这些字节刷新到内部缓冲区。该内部缓冲区立即达到其缓冲区限制(因为它们是相同的限制)并将这些字节刷新到输出。您没有任何好处,但您确实必须在内存中额外复制字节(到字节缓冲区)。
这里的"Buffered"主要是体现接口的语义(API)。注意到这一点,可以通过 BufferedReader
的链接来组合 IO 管道。一般来说,考虑到在链的末尾消耗单个字节可能涉及头部的多次读取,理论上和根据 API,可能只是一个 计算 基于头部读取的数据。
对于块设备缓冲的一般情况(例如从具有块大小数据传输的 IO 设备读取,例如 FS 或网络端点),链接缓冲区(有效队列)肯定会增加内存消耗,立即增加延迟处理(由于总缓冲区大小增加)。它通常会显着增加吞吐量(对延迟有显着的负面影响)。
我知道 BufferedWriter
或 BufferedReader
不能直接与文件通信。 它需要包装另一个 Writer
对象才能做它。喜欢,
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("abc.txt"));
这里我们只是使用 BufferedWriter
包装一个 FileWriter
对象以获得 IO 性能优势。
但我也可以这样做,
BufferedWriter bufferedWriter = new BufferedWriter(new BufferedWriter(new FileWriter("abc.txt")));
此处 FileWrite 对象使用 BufferedWriter 包装,而 BufferedWriter 又使用另一个 BufferedWriter 包装。或者更邪恶的想法是将它链接得更远。
double BufferedWriter有什么真正的优势吗?或者进一步链接它?这同样适用于 BufferedReader。
没有任何好处,没有。
首先,您必须了解缓冲的用途。当你写入磁盘时,硬盘驱动器需要物理地将磁头移动到正确的位置,然后等待磁盘旋转到正确的位置,然后然后开始写入磁盘在磁头下旋转时的字节数。相对而言,前两个步骤比其余操作要慢得多。这意味着有很多固定开销:写入 1000 个字节比写入 1 个字节 1000 次要快得多。
因此,缓冲只是一种让应用程序以一种易于应用程序逻辑的方式写入字节的方法——一次一个字节,三个字节,1000 字节,等等——同时仍然获得磁盘性能。大多数对缓冲区的写操作实际上不会导致任何字节进入底层输出流;只有当您达到某个限制(例如,每 1000 字节)后,所有内容才会一次性全部写入。
在输入上也是一样的。
因此,链接这些没有帮助。对于链,假设它们具有相同的缓冲区大小,您将写入 "outer" 缓冲区,而它根本不会写入 "inner" 缓冲区......然后当它达到其限制时,它会将所有这些字节刷新到内部缓冲区。该内部缓冲区立即达到其缓冲区限制(因为它们是相同的限制)并将这些字节刷新到输出。您没有任何好处,但您确实必须在内存中额外复制字节(到字节缓冲区)。
"Buffered"主要是体现接口的语义(API)。注意到这一点,可以通过 BufferedReader
的链接来组合 IO 管道。一般来说,考虑到在链的末尾消耗单个字节可能涉及头部的多次读取,理论上和根据 API,可能只是一个 计算 基于头部读取的数据。
对于块设备缓冲的一般情况(例如从具有块大小数据传输的 IO 设备读取,例如 FS 或网络端点),链接缓冲区(有效队列)肯定会增加内存消耗,立即增加延迟处理(由于总缓冲区大小增加)。它通常会显着增加吞吐量(对延迟有显着的负面影响)。