无法将ByteBuffer放在另一个更大的ByteBuffer中

时间:2014-07-07 11:38:55

标签: java bytebuffer

我有以下代码:

byte[] payloadArray = getPayload();
int size = (HEADER_SIZE+payloadArray.length);
ByteBuffer cmdBuffer = ByteBuffer.allocate(HEADER_SIZE+payloadArray.length);

//create command
ByteBuffer lengthBuf = ByteBuffer.allocate(2);
lengthBuf.order(ByteOrder.BIG_ENDIAN);
lengthBuf.putChar((char)(size-2));

cmdBuffer.put(lengthBuf);

cmdBuffer.put(getFlag());

执行最后一个命令后,cmdBuffer的前两个字节应显示getFlag()lengthBuf的值。但是,这在cmdBuffer内部不可见。

我不确定这里有什么问题。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

我怀疑原因是lengthBuf中没有剩余的字节。

来自putChar(char)上的JavaDoc:

  

以当前字节顺序将包含给定char值的两个字节写入当前位置的此缓冲区,然后将位置递增2。

来自put(ByteBuffe)上的JavaDoc:

  

...
  否则,此方法从给定缓冲区将n = src.remaining()字节复制到此缓冲区中,从每个缓冲区的当前位置开始。然后将两个缓冲区的位置递增n。

因此put操作从lengthBuf的当前位置读取,这是结束,没有剩余字节。

lengthBuf.reset()之后尝试putChar(...),这应该仅重置位置。请注意,可能不支持缓冲区实施reset(),但ByteBuffer.allocate()会创建支持该操作的HeapByteBuffer

修改

Oleg Estekhin指出,您最好使用lengthBuf.flip()代替lengthBuf.reset()

来自JavaDoc:

  

在一系列通道读取或放置操作之后,调用此方法以准备一系列通道写入或相对获取操作。