bvd*_*vdb 46
实际上有许多方法可以处理字节.我同意选择最好的一个并不总是那么容易:
byte[]java.nio.ByteBufferjava.io.ByteArrayOutputStream(与其它流组合)java.util.BitSet的byte[]仅仅是一个原始阵列,只是包含的原始数据.因此,它没有方便的方法来构建或操作内容.
A ByteBuffer更像是建筑师.它创造了一个byte[].与数组不同,它有更方便的辅助方法.(例如append(byte)方法).就使用而言,这并不是那么简单.(大多数的教程是太复杂或质量较差,但是这一个会得到你的地方.把它一步?然后阅读有关的诸多陷阱.)
你可能会想要说一个ByteBuffer做byte[]什么,做什么StringBuilder做String.但是这个ByteBuffer课程有一个特定的差异/缺点.就像数组一样,它ByteBuffer具有固定的大小.因此,在实例化它时,您必须指定缓冲区的大小.
这就是原因之一,为什么我经常喜欢使用ByteArrayOutputStream它,因为它会自动调整大小,就像它ArrayList一样.(它有一种toByteArray()方法).有时它是实用的,包装在一个DataOutputStream.优点是您将有一些额外的便利调用(例如,writeShort(int)如果您需要写2个字节.)
BitSet当您想要执行位级操作时,它会派上用场.您可以获取/设置单个位,它具有逻辑运算符方法,如xor().(该toByteArray()方法仅在java 7中引入.)
当然,根据您的需要,您可以将所有这些组合起来构建您的byte[].
小智 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)是您最好的朋友.
这两篇文章可能会帮助您http://nadeausoftware.com/articles/2008/02/java_tip_how_read_files_quickly和http://evanjones.ca/software/java-bytebuffers.html
| 归档时间: |
|
| 查看次数: |
30571 次 |
| 最近记录: |