如何从 ByteBuffer 中提取使用过的字节数组?

How to extract used byte array from ByteBuffer?

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

我有一个 ByteBuffer,我将其分配为一定大小,然后向其中插入数据。

ByteBuffer oldBuffer = ByteBuffer.allocate(SIZE);
addHeader(oldBuffer, pendingItems);
newBuffer.flip();
oldBuffer.put(newBuffer);
// as of now I am sending everything from oldBuffer
send(address, oldBuffer.array());

我怎样才能发送 oldBuffer 中正在使用的内容?有没有一种班轮可以做到这一点?

您可以翻转缓冲区,然后用缓冲区的剩余大小创建一个新数组并填充它。

oldBuffer.flip();
byte[] remaining = new byte[oldBuffer.remaining()];
oldBuffer.get(remaining);

另一种方式在一个班轮与 flip()Arrays.copyOf

oldBuffer.flip();
Arrays.copyOf(oldBuffer.array(), oldBuffer.remaining());

没有flip()

Arrays.copyOf(oldBuffer.array(), oldBuffer.position());

也像EJP说的,如果你可以访问send(..)方法,你可以在send()方法中添加一个size和offset参数,避免需要创建和填充一个新的数组。

缓冲区的position()表示缓冲区中已使用数据量。

因此创建一个该大小的字节数组。

接下来转到缓冲区的位置0,因为你必须从那里读取数据。 rewind() 这样做。

然后使用get()方法将缓冲区数据复制到数组中。

byte[] data = new byte[buffer.position()];
buffer.rewind();
buffer.get(data);

另请注意,buffer.array() 仅在 buffer.hasArray() returns 为真时才有效。所以在调用它之前检查 hasArray() 。否则,buffer.array() 将抛出以下任何异常。

  1. UnsupportedOperationException - 在直接缓冲区上调用它时。
  2. ReadOnlyBufferException - 如果缓冲区是只读的。