什么时候使用字节数组,什么时候使用字节缓冲区?

新手上路,请多包涵

字节数组和字节缓冲区有什么区别?

另外,在什么情况下应该优先考虑一个?

[我的用例是用 java 开发的 Web 应用程序]。

原文由 Rajat Gupta 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 396
1 个回答

实际上有很多方法可以处理字节。我同意选择最好的并不总是那么容易:

  • byte[]
  • java.nio.ByteBuffer
  • java.io.ByteArrayOutputStream (结合其他流)
  • java.util.BitSet

byte[] 只是一个原始数组,只包含原始数据。因此,它没有方便的方法来构建或操作内容。

A ByteBuffer 更像是一个建造者。 它创建一个 byte[] 。与数组不同,它有更方便的辅助方法。 (例如 append(byte) 方法)。就 用法 而言并不是那么简单。 (大多数教程都太复杂或质量很差,但 这个 教程会让你有所收获。更进一步?然后阅读许多 陷阱。)

You could be tempted to say that a ByteBuffer does to byte[] , what a StringBuilder does for String .但是 ByteBuffer 类有一个具体的区别/缺点。虽然看起来字节缓冲区会在您添加元素时自动调整大小, ByteBuffer 实际上具有固定容量。 当您实例化它时,您已经必须指定缓冲区的 最大大小

这就是为什么 我经常更喜欢使用 ByteArrayOutputStream 的原因之一,因为它会自动调整大小, 就像 ArrayList 一样。 (它有一个 toByteArray() 方法)。有时 将其包装在 DataOutputStream 中很实用。 优点是您将有一些额外的便利调用,(例如 writeShort(int) 如果您需要写入 2 个字节。)

BitSet 当你想执行位级操作时派上用场。 您可以获取/设置各个位,并且它具有逻辑运算符方法,例如 xor() 。 ( toByteArray() 方法仅在 Java 7 中引入。)

当然,根据您的需要,您可以将所有这些组合起来构建您的 byte[]

原文由 bvdb 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题