ByteArrayOutputStream(int size)中的缓冲区究竟是什么?

时间:2018-05-27 09:42:50

标签: java io

我理解写入文件时缓冲区是什么 - 操作系统文件写入(调用本机API - 一个字符的一个方法调用)成本很高,因此在缓冲区中收集了很多字符/字节并写入了缓冲区通过一个OS API调用来提交文件。

但这里的缓冲区是什么意思?为什么?

  

ByteArrayOutputStream(int size) - 创建一个新的字节数组输出   流,具有指定大小的缓冲区容量,以字节为单位。

ByteArrayOutputStream()默认情况下有32个字节的缓冲区,这就是为什么Apache Commons与缓冲区大小和机制完全不同的org.apache.commons.io.output.ByteArrayOutputStream类的原因:"原始实现只分配开头是32个字节。由于此类设计用于重载,因此它以1024字节开始。与原始内容相比,它不会重新分配整个内存块,但会分配额外的缓冲区。这样就不需要对缓冲区进行垃圾回收,也不必将内容复制到新缓冲区。此类的设计与原始类似。 "

除了ByteArrayInputStream(byte[] buf)中的,我理解" buf" (缓冲区)实际上是一个数据源(字节),用于输入InputStream (ByteArrayInputStream模拟来自字节数组的InputStream),所以这里的字缓冲区在我看来很混乱。

2 个答案:

答案 0 :(得分:2)

  

此类实现一个输出流,其中数据被写入字节数组缓冲区会在数据写入时自动增长。

两个大胆的术语是同义词。缓冲区是byte[]数组,用于保存写入流的字节。

缓冲区大小类似于capacity of an ArrayList。如果向流写入超过32个字节,则必须增加缓冲区,这涉及分配新数组并将字节从旧复制到新。默认"容量"如果你知道你写的不仅仅是那个,那么32的效率是低效的。

答案 1 :(得分:1)

Javadoc说:

  

此类实现一个输出流,其中数据被写入字节数组。当数据写入缓冲区时,缓冲区会自动增长。

所以在两个句子的空间里,它使用了两个不同的术语。同一文档中还有许多其他示例。

一方面,如果你不知道他们指的是同一件事,这可能会令人困惑;如果它说的话可能会更清楚:

  

写入缓冲区,实现为字节数组。

但我认为这是一个简单的事实,一旦你知道(或假设,因为这是一件非常普遍的事情)他们指的是同一件事,不再特别令人困惑。