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

时间:2011-03-06 13:43:49

标签: java byte bytearray buffer

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

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

3 个答案:

答案 0 :(得分:40)

实际上有很多方法可以处理字节。我同意选择最好的一个并不容易:

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

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

ByteBuffer更像是建设者。它会创建byte[]。与数组不同,它有更方便的辅助方法。 (例如append(byte)方法)。就usage而言,这并不是那么简单。 (大多数教程太复杂或质量很差,但是这个one会让你到达某个地方。更进一步?然后阅读许多pitfalls。) < / p>

您可能会想ByteBufferbyte[]表示StringBuilderString的作用。但是ByteBuffer类存在特定的差异/缺点。就像数组一样, ByteBuffer具有固定的大小。因此,当您实例化它时,您必须指定缓冲区的大小。

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

当您想要执行位级操作时,

BitSet会派上用场。您可以获取/设置各个位,并且它具有xor()等逻辑运算符方法。 (toByteArray()方法仅在java 7中引入。)

当然,根据您的需求,您可以将所有这些内容组合在一起构建byte[]

答案 1 :(得分:23)

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

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

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

答案 2 :(得分:3)