Java - ByteBuffer 还是 ArrayList<Byte>?

标签 java arraylist bytebuffer

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

  • addAll()不适用于 byte数组(甚至使用 Arrays.asList() ,它返回我 List<Byte[]> )。要修复它,我只是循环并添加一个 byte在每个循环中,但我想这假设有很多函数调用,因此它有性能成本。
  • 获取 byte[] 也是如此来自 ArrayList .我无法从 Byte[] 转换至 byte[] ,所以我必须为此使用一个循环。
  • 我想存储字节而不是字节会占用更多内存。

我知道ByteArrayInputStreamByteArrayOutputStream可以用于此,但它有一些不便:

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

因此,我的问题来了:会使用 ByteBuffer 吗?更有效率?我知道你可以拿integers , floats等等,甚至能够改变字节顺序。我想知道的是,使用 ByteBuffer 之间是否存在真正的性能变化?和一个 ArrayList<Byte> .

最佳答案

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

byteBuffer.order(ByteBuffer.LITTLE_ENDIAN);

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

一个 ByteBuffer 可以包装一个字节数组,或者分配。

关于Java - ByteBuffer 还是 ArrayList<Byte>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31453743/

相关文章:

java - jsp 编译器的奇怪行为

Java打印ArrayList的ArrayList

Java:DOM 如何从名称列表中重命名节点名称

java - 比较 ByteBuffer 的内容?

java - 如何在Java中解析直接内存中的Google Protocol Buffers而不分配堆字节数组?

Java,从文件创建 double 字符串数组时遇到问题

java - 将应用程序部署到 Google 应用程序引擎时出现问题

java - 如何从n组不同大小的数字中选择n个数字?

java 从 csv 文件中读取并将其信息存储到 ArrayList<class>

c++ - 如何在 C++ 中从字节数组(BIG-ENDIAN)中提取单个字段