字节数组和字节缓冲区有什么区别?
另外,在什么情况下应优先选择另一种?
[我的用例是用Java开发的Web应用程序]。
字节数组和字节缓冲区有什么区别?
另外,在什么情况下应优先选择另一种?
[我的用例是用Java开发的Web应用程序]。
Answers:
实际上,有许多种处理字节的方法。我同意选择最佳的方法并不总是那么容易:
byte[]
java.nio.ByteBuffer
java.io.ByteArrayOutputStream
(与其它流组合)java.util.BitSet
的byte[]
仅仅是一个原始阵列,只是包含的原始数据。因此,它没有用于构建或处理内容的便捷方法。
AByteBuffer
更像是建造者。它创建一个byte[]
。与数组不同,它具有更方便的辅助方法。(例如append(byte)
方法)。在用法上并不是那么简单。(大多数的教程是太复杂或质量较差,但是这一个会得到你的地方。把它一步?然后阅读有关的诸多陷阱。)
您可能会很想说aByteBuffer
做对byte[]
,aStringBuilder
做对什么String
。但是ByteBuffer
该类存在特定的差异/缺点。就像使用数组,该ByteBuffer
有一个固定的大小。因此,在实例化它时,您已经必须指定缓冲区的大小。
这就是原因之一,我ByteArrayOutputStream
之所以经常喜欢使用,是因为它像aArrayList
一样会自动调整大小。(它有一个toByteArray()
方法)。有时将其包装在实用DataOutputStream
。这样做的好处是,您将获得一些其他的便捷调用(例如,writeShort(int)
如果您需要写入2个字节)。
BitSet
当您要执行位级操作时,它会派上用场。您可以获取/设置各个位,并且具有类似的逻辑运算符方法xor()
。(该toByteArray()
方法仅在Java 7中引入。)
当然,根据您的需求,您可以结合所有这些来建立您的byte[]
。
ByteBuffer是新IO软件包(nio)的一部分,该软件包是为快速处理基于文件的数据而开发的。具体来说,Apache是一种非常快速的Web服务器(用C编写),因为它从磁盘读取字节并将其直接放入网络,而无需通过各种缓冲区将它们改组。它通过内存映射文件来完成此任务,而Java的早期版本则没有。随着nio的出现,用Java编写与Apache一样快的Web服务器成为可能。当您想要非常快的文件到网络吞吐量时,则要使用内存映射文件和ByteBuffer。
数据库通常使用内存映射文件,但是这种用法在Java中很少有效。在C / C ++中,可以加载大量内存并将其转换为所需的类型化数据。由于Java的安全性模型,这通常不可行,因为您只能转换为某些本机类型,而这些转换效率不是很高。当您仅将字节作为纯字节数据进行处理时,ByteBuffer效果最佳。一旦需要将其转换为对象,其他java io类通常会表现更好并且更易于使用。
如果您不处理内存映射文件,那么您实际上就不必费心ByteBuffer了-您通常会使用字节数组。如果您要构建Web服务器,并以尽可能快的吞吐量处理基于文件的原始字节数据,则ByteBuffer(特别是MappedByteBuffer)是您最好的朋友。
Unsafe
。