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

fla*_*ash 6 java arrays nio bytebuffer guava

java.nio.ByteBuffer类有一个ByteBuffer.array()方法,然而,这将返回一个数组,它是该缓冲区的容量的大小,而不是使用容量。因此,我遇到了一些问题。

我有一个 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());
Run Code Online (Sandbox Code Playgroud)

我怎么能只发送oldBuffer. 有没有一种班轮可以做到这一点?

Jos*_*lva 7

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

oldBuffer.flip();
byte[] remaining = new byte[oldBuffer.remaining()];
oldBuffer.get(remaining);
Run Code Online (Sandbox Code Playgroud)

flip()Arrays.copyOf 单行的另一种方式

oldBuffer.flip();
Arrays.copyOf(oldBuffer.array(), oldBuffer.remaining());
Run Code Online (Sandbox Code Playgroud)

而没有 flip()

Arrays.copyOf(oldBuffer.array(), oldBuffer.position());
Run Code Online (Sandbox Code Playgroud)

也像 EJP 所说的那样,如果您可以访问该send(..)方法,则可以向该方法添加大小和偏移量参数send(),而无需创建和填充新数组。