字节数组和字节数之间有什么区别?字节缓冲区?
此外,在什么情况下应该优先于另一种?
[我的用例是用于在java中开发的Web应用程序]。
答案 0 :(得分:40)
实际上有很多方法可以处理字节。我同意选择最好的一个并不容易:
byte[]
java.nio.ByteBuffer
java.io.ByteArrayOutputStream
(与其他流相结合)java.util.BitSet
byte[]
只是一个原始数组,只包含原始数据。因此,它没有方便的方法来构建或操作内容。
ByteBuffer
更像是建设者。它会创建byte[]
。与数组不同,它有更方便的辅助方法。 (例如append(byte)
方法)。就usage而言,这并不是那么简单。 (大多数教程太复杂或质量很差,但是这个one会让你到达某个地方。更进一步?然后阅读许多pitfalls。) < / p>
您可能会想ByteBuffer
对byte[]
表示StringBuilder
对String
的作用。但是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)