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

Raj*_*pta 62 java buffer byte bytearray

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

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

bvd*_*vdb 46

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

  • byte[]
  • java.nio.ByteBuffer
  • java.io.ByteArrayOutputStream(与其它流组合)
  • java.util.BitSet

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

A ByteBuffer更像是建筑师.它创造了一个byte[].与数组不同,它有更方便的辅助方法.(例如append(byte)方法).就使用而言,这并不是那么简单.(大多数的教程是太复杂或质量较差,但是这一个会得到你的地方.把它一步?然后阅读有关的诸多陷阱.)

你可能会想要说一个ByteBufferbyte[]什么,做什么StringBuilderString.但是这个ByteBuffer课程有一个特定的差异/缺点.就像数组一样,ByteBuffer具有固定的大小.因此,在实例化它时,您必须指定缓冲区的大小.

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

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

当然,根据您的需要,您可以将所有这些组合起来构建您的byte[].

  • 你的回答很有帮助 (2认同)

小智 24

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

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

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

  • Java安全模型不是限制.JVM体系结构阻止您将字节转换为类型化数据. (2认同)
  • 查看代码,安全管理器调用似乎只发生在 DirectByteBuffer 情况下。我认为这是因为该方法使用了“不安全”。 (2认同)

blu*_*oot 3

这两篇文章可能会帮助您http://nadeausoftware.com/articles/2008/02/java_tip_how_read_files_quicklyhttp://evanjones.ca/software/java-bytebuffers.html

  • 您可以通过让我们知道为什么这些链接可能有帮助来提高此答案的质量。仅链接的答案并不理想。 (7认同)