从 Java 中的 ByteBuffer 中获取字节数组

2022-08-31 09:34:24

这是从字节缓冲区获取字节的推荐方法吗?

ByteBuffer bb =..

byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);

答案 1

取决于您要执行的操作。

如果您想要的是检索剩余的字节(在位置和限制之间),那么您拥有的将起作用。您也可以只做:

ByteBuffer bb =..

byte[] b = new byte[bb.remaining()];
bb.get(b);

这相当于ByteBuffer javadocs。


答案 2

请注意,bb.array() 不支持字节缓冲区位置,如果您正在处理的字节缓冲区是其他缓冲区的切片,则可能会更糟。

byte[] test = "Hello World".getBytes("Latin1");
ByteBuffer b1 = ByteBuffer.wrap(test);
byte[] hello = new byte[6];
b1.get(hello); // "Hello "
ByteBuffer b2 = b1.slice(); // position = 0, string = "World"
byte[] tooLong = b2.array(); // Will NOT be "World", but will be "Hello World".
byte[] world = new byte[5];
b2.get(world); // world = "World"

这可能不是你打算做的。

如果您真的不想复制字节数组,则解决方法可能是使用字节缓冲区的 arrayOffset() + remaining(),但这仅在应用程序支持索引 + 所需字节缓冲区长度时才有效。