【问题标题】:What is the buffer in ByteArrayOutputStream(int size) exactly?ByteArrayOutputStream(int size) 中的缓冲区到底是什么?
【发布时间】:2018-11-06 03:11:26
【问题描述】:

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

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

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

ByteArrayOutputStream() 默认有 32 个字节的缓冲区,这就是为什么 Apache Commons 具有完全相同的类 org.apache.commons.io.output.ByteArrayOutputStream 仅缓冲区大小和机制不同:“原始实现仅在开始。由于这个类是为重型设计的,它从 1024 字节开始。与原来的相比,它不会重新分配整个内存块,而是分配额外的缓冲区。这样就不需要对缓冲区进行垃圾收集,内容也不需要'不必将其复制到新缓冲区。此类的行为与原始类完全一样。"

除了ByteArrayInputStream(byte[] buf) 中,据我了解,“buf”(缓冲区)实际上是要输入 InputStream 的数据源(字节)(ByteArrayInputStream 模拟字节数组中的 InputStream),所以我认为这里的缓冲区一词令人困惑。

【问题讨论】:

  • 缓冲区只是用于(通常是临时的)数据收集的内存区域。如果您更清楚,您可以将文本中的buffer 替换为internal array
  • 这是一个字节数组。我看不出输入流输出流有什么混淆。

标签: java io


【解决方案1】:

Javadoc 说:

这个类实现了一个输出流,其中数据被写入一个字节数组。缓冲区会随着数据写入而自动增长。

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

一方面,如果您不知道它们指的是同一个东西,这可能会令人困惑;如果它说的是这样的话可能会更清楚:

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

但我认为这是一个简单的事实,一旦您知道(或假设,因为这是很常见的事情)它们指的是同一事物,就不再特别令人困惑。

【讨论】:

    【解决方案2】:

    这个类实现了一个输出流,其中数据被写入一个字节数组缓冲区会随着数据写入而自动增长。

    这两个粗体字是同义词。缓冲区是byte[] 数组,用于保存写入流中的字节。

    缓冲区大小类似于capacity of an ArrayList。如果您向流中写入超过 32 个字节,则它必须增大缓冲区,这涉及分配一个新数组并将字节从旧数组复制到新数组。如果你知道你会写更多,默认的“容量”32 是低效的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      • 2020-04-24
      • 2012-06-03
      • 1970-01-01
      • 2012-06-21
      相关资源
      最近更新 更多