【问题标题】:Reading first four bytes from ByteBuffer, then writing them back?从 ByteBuffer 读取前四个字节,然后将它们写回?
【发布时间】:2015-11-27 14:41:30
【问题描述】:

我有一个名为 msg 的 ByteBuffer 对象,在前四个字节中具有预期的消息长度,我将其读取如下:

    int msgLen = msg.getInt();
    LOG.debug("Message size: " + msgLen);

如果msgLen 小于某个阈值,我有部分消息需要缓存。在这种情况下,我想将前四个字节放回消息的开头;也就是说,将消息重新组合在一起以与预读相同。例如:

if (msgLen < threshold) {
    msg.rewind();
    msg.put(msgLen);

不幸的是,这似乎不是正确的方法。我尝试过很多翻转、放置和倒带的组合,但一定是误解。

如何按原始顺序将字节放回写入缓冲区?

【问题讨论】:

  • 不清楚为什么要将这些字节“放回”?如果你这样做rewind,你已经在msg的乞讨中,那些获得的字节不会从缓冲区中删除。
  • 如果我的流无法倒带,它会引发错误,对吗?我的调试器显示回卷器操作确实重置了位置。 Andremoniy,谢谢,我认为读取时会消耗字节。仍然没有得到预期的行为,但也许这是我的目标。
  • @GuillaumeF。 ByteBuffers 不是流
  • 回到手头的问题;如果您对消息进行了“部分阅读”,您如何将任何进一步的输入与之前的部分阅读相关联?你有某种身份吗?如果不这样做,那么如何处理多个部分读取?
  • 感谢 fge,您的意思是从多个输入源进行部分读取? IE 2 消息同时分块发送?

标签: java bytearray bytebuffer


【解决方案1】:

答案由 Andremoniy 在 cmets 部分发布。读取操作不消耗缓冲区中的字节,因此msg.rewind() 就足够了。由于程序中的一些其他逻辑,这在我的情况下不起作用,并且我错误地将其与缓冲区级别的问题相关联。

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多