1

我一直在尝试从 Bytes 对象中检索 ByteBuffer (Direct) 对象引用。以下是代码:

TestMessageWire testMessageWire = new TestMessageWire();
testMessageWire.data('H');
testMessageWire.setIntData(100);

//Below does not give ByteBuffer with correct position & offset
Bytes<ByteBuffer> bytes = Bytes.elasticByteBuffer(10);
Wire wire = new RawWire(bytes);
testMessageWire.writeMarshallable(wire);
ByteBuffer byteBuffer = ByteBuffer.wrap(bytes.toByteArray());

//Another approach, but still does not populate "byteBuffer" object correctly.
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(6);
Bytes<?> bytes = Bytes.wrapForWrite(byteBuffer);
Wire wire = new RawWire(bytes);
testMessageWire.writeMarshallable(wire);

我想在创建 ByteBuffer 对象时避免多次分配。因此,想要重用由 Bytes 包装的相同 Bitebuffer。我怎样才能做到这一点?

4

1 回答 1

1

您可以创建一个包装 ByteBuffer 的 Bytes。这避免了冗余副本。

Bytes<ByteBuffer> bytes = Bytes.elasticByteBuffer();
ByteBuffer bb = bytes.underlyingObject();

由于 Bytes 具有单独的读/写位置和限制,因此您必须确保保持 ByteBuffer 的位置和限制。

例如,在写入之后您可能想要执行以下操作,以便您可以从 ByteBuffer 中读取写入字节的内容。

bb.position((int) bytes.readPosition());
bb.limit((int) bytes.readLimit());
于 2018-07-13T09:38:53.653 回答