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

时间:2018-03-14 23:08:58

标签: java arrays guava nio bytebuffer

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());

如何发送oldBuffer中使用的内容。有没有一个班轮可以做到这一点?

2 个答案:

答案 0 :(得分:3)

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

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()方法添加大小和偏移量参数,并且无需创建和填充新数组。

答案 1 :(得分:0)

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

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

接下来,由于必须从那里读取数据,因此转到缓冲区的位置0。 rewind()执行此操作。

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

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

还要注意,buffer.array()仅在buffer.hasArray()返回true时有效。因此,在调用之前检查hasArray()。否则,buffer.array()将引发以下任何异常。

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