最近,我创建了一个包装器,用于将数据读取和写入字节数组.为此,我一直在使用ArrayList< Byte> ;,但我想知道这是否是最有效的方法,因为:
> addAll()不适用于字节数组(即使使用Arrays.asList(),它也会向我返回List< Byte []>).为了解决这个问题,我只是循环并在每个循环中添加一个字节,但是我想这需要大量的函数调用,因此会降低性能.
>从ArrayList获取byte []也会发生同样的情况.我无法从Byte []转换为byte [],因此必须使用循环.
>我想存储字节而不是字节会占用更多内存.
我知道ByteArrayInputStream和ByteArrayOutputStream可以用于此目的,但是有一些不便之处:
>我想实现以不同字节顺序读取不同数据类型的方法(例如readInt,readLEInt,readUInt等),而这些类只能读取/写入字节或字节数组.这并不是真正的问题,因为我可以在包装器中修复它.但是这是第二个问题.
>我希望能够同时进行读写操作,因为我正在使用它来解压缩某些文件.因此,要为其创建包装,我需要同时包含ByteArrayInputStream和ByteArrayOutputStream.我不知道它们是否可以某种方式同步化,或者每次写给包装器时都必须将一个的全部数据写到另一个.
因此,我的问题来了:使用ByteBuffer会更有效吗?我知道您可以从中获取整数,浮点数等,甚至可以更改字节顺序.我想知道的是,在使用ByteBuffer和ArrayList< Byte>之间是否存在真正的性能变化.
解决方法:
绝对是ByteBuffer或ByteArrayOutputStream.在您的情况下,ByteBuffer似乎不错.检查Javadoc,因为它具有不错的方法,对于putInt / getInt等,您可能想要设置顺序(这4个字节)
byteBuffer.order(ByteBuffer.LITTLE_ENDIAN);
对于文件,可以使用getChannel()或变体,然后使用MappedByteBuffer.
ByteBuffer可以包装字节数组或分配.