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

How to obtain used byte[] from ByteBuffer

java.nio.ByteBuffer class 有一个 ByteBuffer.array() 方法,但是这个 returns 一个数组,它是缓冲区容量的大小,而不是已用容量。因此,我遇到了很多问题。

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

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

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

在某些情况下,也可以获取 ByteBuffer 的后备数组,但不推荐 ...

有关更多详细信息,javadoc 是 here

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

remaining()

Returns the number of elements between the current position and the limit.

此外:

A buffer's capacity is the number of elements it contains. The capacity of a buffer is never negative and never changes.

A buffer's limit is the index of the first element that should not be read or written. A buffer's limit is never negative and is never greater than its capacity.

A buffer's position is the index of the next element to be read or written. A buffer's position is never negative and is never greater than its limit.

考虑到所有这些,这个怎么样:

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)