Java - ByteBuffer 还是 ArrayList<Byte>?

eri*_*c.m 5 java bytebuffer arraylist

最近我创建了一个包装器来读取和写入数据到一个byte数组中。为此,我一直在使用ArrayList<Byte>,但我想知道这是否是最有效的方法,因为:

  • addAll()不适用于byte数组(即使使用Arrays.asList(),它返回 me List<Byte[]>)。为了修复它,我只是循环并byte在每个循环中添加一个,但我想这假设了很多函数调用,因此它具有性能成本。
  • 同样的情况,为得到一个byte[]ArrayList。我无法从Byte[]to投射byte[],所以我必须使用循环。
  • 我想存储 Byte 而不是 byte 会使用更多的内存。

我知道ByteArrayInputStream并且ByteArrayOutputStream可以用于此,但它有一些不便之处:

  • 我想实现以不同字节顺序读取不同数据类型的方法(例如readIntreadLEIntreadUInt、 等),而这些类只能读取/写入字节或字节数组。这不是真正的问题,因为我可以在包装器中修复它。但是第二个问题来了。
  • 我希望能够同时写入和读取,因为我正在使用它来解压缩一些文件。因此,要为它创建一个包装器,我需要同时包含ByteArrayInputStreamByteArrayOutputStream。我不知道这些是否可以以某种方式同步,或者我每次写入包装器时都必须将一个的整个数据写入另一个。

所以,我的问题来了:使用 aByteBuffer会更有效吗?我知道您可以从中获取integers,floats等,甚至可以更改字节顺序。我想知道的是,使用 aByteBuffer和 a之间是否存在真正的性能变化ArrayList<Byte>

Joo*_*gen 3

肯定是ByteBufferByteArrayOutputStream。在你的情况下ByteBuffer看起来不错。检查 Javadoc,因为它有很好的方法,对于 putInt/getInt 等,您可能需要设置顺序(这 4 个字节)

byteBuffer.order(ByteBuffer.LITTLE_ENDIAN);
Run Code Online (Sandbox Code Playgroud)

对于文件,您可以使用getChannel()或变体,然后使用MappedByteBuffer.

ByteBuffer 可以包装字节数组或分配字节数组。