最近我创建了一个包装器来将数据读写到 byte
中大批。为此,我一直在使用 ArrayList<Byte>
,但我想知道这是否是最有效的方法,因为:
-
addAll()
不适用于byte
数组(甚至使用Arrays.asList()
,它返回我List<Byte[]>
)。要修复它,我只是循环并添加一个byte
在每个循环中,但我想这假设有很多函数调用,因此它有性能成本。 - 获取
byte[]
也是如此来自ArrayList
.我无法从Byte[]
转换至byte[]
,所以我必须为此使用一个循环。 - 我想存储字节而不是字节会占用更多内存。
我知道ByteArrayInputStream
和 ByteArrayOutputStream
可以用于此,但它有一些不便:
- 我想实现以不同字节顺序读取不同数据类型的方法(例如
readInt
、readLEInt
、readUInt
等),而这些类只能读取/写入字节或字节数组.这不是真正的问题,因为我可以在包装器中修复它。但是第二个问题来了。 - 我希望能够同时写入和读取,因为我正在使用它来解压缩一些文件。因此,要为它创建一个包装器,我需要同时包含
ByteArrayInputStream
和ByteArrayOutputStream
.我不知道这些是否可以通过某种方式同步,或者我每次写入包装器时都必须将一个的全部数据写入另一个。
因此,我的问题来了:会使用 ByteBuffer
吗?更有效率?我知道你可以拿integers
, floats
等等,甚至能够改变字节顺序。我想知道的是,使用 ByteBuffer
之间是否存在真正的性能变化?和一个 ArrayList<Byte>
.
最佳答案
肯定是 ByteBuffer 或 ByteArrayOutputStream。在你的情况下 ByteBuffer似乎很好。 检查 Javadoc,因为它有很好的方法,对于 putInt/getInt 等,您可能想要设置顺序(这 4 个字节)
byteBuffer.order(ByteBuffer.LITTLE_ENDIAN);
对于文件,您可以使用 getChannel()
或变体,然后使用 MappedByteBuffer
。
一个 ByteBuffer 可以包装一个字节数组,或者分配。
关于Java - ByteBuffer 还是 ArrayList<Byte>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31453743/