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
中使用的内容。有没有一个班轮可以做到这一点?
答案 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()
将引发以下任何异常。
UnsupportedOperationException
-在直接缓冲区上调用时。ReadOnlyBufferException
-如果缓冲区是只读的。