如何从 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()
将抛出以下任何异常。
UnsupportedOperationException
- 在直接缓冲区上调用它时。
ReadOnlyBufferException
- 如果缓冲区是只读的。
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()
将抛出以下任何异常。
UnsupportedOperationException
- 在直接缓冲区上调用它时。ReadOnlyBufferException
- 如果缓冲区是只读的。