如何从ByteBuffer获取已使用的byte[]

4
java.nio.ByteBuffer类有一个ByteBuffer.array()方法,但是它返回的数组大小是缓冲区容量的大小,而不是已使用的容量大小。因此,我遇到了一些问题。
我注意到使用ByteBuffer.remaining()可以给我当前被缓冲区使用的字节数量,所以基本上我正在寻找一种方法来获取仅包含正在使用的字节的byte[]。(即在ByteBuffer.remaining()中显示的字节。)
我尝试了几种不同的方法,但似乎都失败了,我唯一想到的解决方法是创建另一个ByteBuffer,其分配的大小为剩余缓冲区的大小,然后向其写入(x)个字节。
2个回答

4
阅读Javadocs,我认为remaining()只会给出当前位置和限制之间的字节数。
另外:
一个缓冲区的容量是它包含的元素数量。缓冲区的容量永远不为负且永远不会改变。 缓冲区的限制是不应读取或写入的第一个元素的索引。缓冲区的限制永远不为负且永远不大于其容量。 缓冲区的位置是要读取或写入的下一个元素的索引。缓冲区的位置永远不为负且永远不大于其限制。
因此,考虑到所有这些,如下所示:
static byte[] getByteArray(ByteBuffer bb) {
    byte[] ba = new byte[bb.limit()];
    bb.get(ba);
    return ba;
}

这里使用了 ByteBuffer 的 get(byte[] dst) 方法

public ByteBuffer get(byte[] dst)

Relative bulk get method. This method transfers bytes from this buffer into the given destination array. An invocation of this method of the form src.get(a) behaves in exactly the same way as the invocation

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

1
这段代码有一个错误,你必须在 bb.get(ba) 语句之前调用 bb.rewind() 方法,否则会抛出 BufferUnderflowException 异常。也就是说,如果缓冲区中剩余的字节数小于请求的字节数(即 length > remaining()),则不会传输任何字节,并且会抛出 BufferUnderflowException 异常。 - Marco Romanoni

0

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

在某些情况下,也可能可以获取ByteBuffer的支持数组,但这是不推荐的...

有关更多详细信息,请参阅javadocs here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接