Java 如何从ByteBuffer获取已用字节[]

Java 如何从ByteBuffer获取已用字节[],java,bytebuffer,Java,Bytebuffer,java.nio.ByteBuffer类有一个ByteBuffer.array()方法,但是它返回的数组是缓冲区容量的大小,而不是使用的容量。因此,我有很多问题 我注意到,使用ByteBuffer.remaining()可以得到缓冲区当前使用的字节数,因此基本上我要寻找的是一种只获取所使用字节数的byte[]的方法。(即,ByteBuffer.remaining()中显示的字节 我尝试了一些不同的方法,但似乎失败了,我能想到的唯一解决办法是使用剩余缓冲区的分配大小创建另一个ByteBuffer,

java.nio.ByteBuffer
类有一个
ByteBuffer.array()
方法,但是它返回的数组是缓冲区容量的大小,而不是使用的容量。因此,我有很多问题

我注意到,使用
ByteBuffer.remaining()
可以得到缓冲区当前使用的字节数,因此基本上我要寻找的是一种只获取所使用字节数的
byte[]
的方法。(即,
ByteBuffer.remaining()
中显示的字节


我尝试了一些不同的方法,但似乎失败了,我能想到的唯一解决办法是使用剩余缓冲区的分配大小创建另一个
ByteBuffer
,然后向其写入(x)个字节。

如果需要,分配一个
byte[]
,然后使用
ByteBuffer.get(byte[])
ByteBuffer.get(byte[],int,int)
方法将字节复制到数组中。根据
ByteBuffer
的状态,您可能需要先翻转它

在某些情况下,也可以获取
字节缓冲区的备份阵列,但不建议这样做

要了解更多详细信息,javadocs是。

从阅读中,我认为剩余的只会给出当前位置和限制之间的字节数

剩余()

返回当前位置和限制之间的元素数

此外:

缓冲区的容量是它包含的元素数。缓冲区的容量永远不会为负,也永远不会改变

缓冲区的限制是不应读取或写入的第一个元素的索引。缓冲区的限制永远不会为负,也永远不会大于其容量

缓冲区的位置是要读取或写入的下一个元素的索引。缓冲区的位置永远不会为负,也永远不会超过其限制

因此,考虑到所有这些,我们来看看这个:

static byte[] getByteArray(ByteBuffer bb) {
    byte[] ba = new byte[bb.limit()];
    bb.get(ba);
    return ba;
}
这使用ByteBuffer的
get(byte[]dst)
方法

公共字节缓冲获取(字节[]dst)

相对批量获取方法。 此方法将字节从此缓冲区传输到给定的目标数组中。此方法的src.get(a)形式调用的行为与调用的行为完全相同

 src.get(a, 0, a.length) 

这有一个bug,您必须在bb.get(ba);语句之前执行bb.rewind(),否则将引发BufferUnderflowException。也就是说,如果缓冲区中剩余的字节数少于满足请求所需的字节数,即,如果长度>剩余(),则不会传输任何字节,并引发BufferUnderflowException