何时使用字节数组和何时使用字节缓冲区?

2022-08-31 12:03:31

字节数组和字节缓冲区有什么区别?
此外,在什么情况下应该优先于另一种?

[我的用例是用java开发的Web应用程序]。


答案 1

实际上,有许多方法可以使用字节。我同意,选择最好的一个并不总是那么容易:

  • byte[]
  • java.nio.ByteBuffer
  • (与其他流结合使用)java.io.ByteArrayOutputStream
  • java.util.BitSet

它只是一个基元数组,只包含原始数据。因此,它没有构建或操作内容的便捷方法。byte[]

字节缓冲器更像是构建器。它会创建一个 .与数组不同,它具有更方便的帮助程序方法。(例如方法)。就用法而言,这并不那么简单。(大多数教程太复杂或质量差,但这个教程会让你有所收获。更进一步?然后阅读许多陷阱。byte[]append(byte)

你可能会忍不住说 a do to ,what a do for .但是这个类有一个特定的区别/缺点。尽管在添加元素时,字节缓冲器可能会自动调整大小,但字节缓冲器实际上具有固定的容量。实例化它时,必须指定缓冲区的最大大小ByteBufferbyte[]StringBuilderStringByteBuffer

这就是为什么我经常更喜欢使用ByteArrayOutputStream的原因之一,因为它会自动调整大小,就像一个一样。(它有一个方法)。有时,将其包装在DataOutputStream中是实用的。优点是您将有一些额外的便利电话,(例如 如果需要写入 2 个字节。ArrayListtoByteArray()writeShort(int)

当您想要执行位级操作时,BitSet 会派上用场。您可以获取/设置各个位,它具有逻辑运算符方法,例如 。(该方法仅在java 7中引入。xor()toByteArray()

当然,根据您的需求,您可以将它们全部组合起来构建.byte[]


答案 2

ByteBuffer是新的IO包(nio)的一部分,该包是为基于文件的数据的快速吞吐量而开发的。具体来说,Apache是一个非常快速的Web服务器(用C编写),因为它从磁盘读取字节并直接将它们放在网络上,而无需通过各种缓冲区将它们洗牌。它通过内存映射文件来实现这一点,这是早期版本的Java所没有的。随着nio的出现,用Java编写一个与Apache一样快的Web服务器成为可能。当您想要非常快的文件到网络吞吐量时,则需要使用内存映射文件和 ByteBuffer。

数据库通常使用内存映射文件,但这种类型的用法在 Java 中很少有效。在 C/C++ 中,可以加载大量内存并将其转换为所需的类型化数据。由于Java的安全模型,这通常不可行,因为您只能转换为某些本机类型,并且这些转换不是很有效。当您只是将字节作为纯字节数据处理时,ByteBuffer效果最好 - 一旦您需要将它们转换为对象,其他java io类通常性能更好,更易于使用。

如果你不处理内存映射文件,那么你真的不需要打扰ByteBuffer - 你通常会使用字节数组。如果您正在尝试构建一个Web服务器,并且具有基于文件的原始字节数据的最快吞吐量,那么ByteBuffer(特别是MappedByteBuffer)是您最好的朋友。