【发布时间】:2012-03-06 04:14:04
【问题描述】:
我了解BufferedOutputStream 背后的理论。字节被写入缓冲区数组,直到它被填满,然后写入(刷新)到底层流 - 因为操作系统调用更少,所以它比逐字节写入更快。
然而,从 BufferedOutputStream 类和方法 (BufferedOutputStream.java) 的实现来看,似乎最终来自缓冲区的字节只是逐字节写入。
我认为是这样的,因为:
在 BufferedOutputStream.write(byte b[], int off, int len) 中有一行 out.write(b, off, len)。由于 out 是 OutputStream 的一个实例,而不是 BufferedOutputStream,它正在调用 OutputStream.write(byte[], int, int)。这又使用 for 循环逐字节写入
请有人澄清实际发生了什么,以及它如何更快?
【问题讨论】:
-
使用
out.write(bytes ,offset, length)刷新缓冲区是如何逐字节进行的?你能说得更具体点吗? -
但是out.write(bytes ,offset, length) 没有调用OutputStream.java 中的write(byte b[], int off, int len) 方法吗?然后哪个使用 for 循环分别写入缓冲区中的每个字节?
-
OutputStream是抽象的。大多数子类将使用更有效的版本覆盖此方法。以FileOutputStream 为例。 -
对Behind the scenes of Java's BufferedInputStream OP 的评论可能会有所帮助。
标签: java buffer flush bufferedoutputstream