从 ByteBuffer 读取前四个字节,然后将它们写回?

Posted

技术标签:

【中文标题】从 ByteBuffer 读取前四个字节,然后将它们写回?【英文标题】:Reading first four bytes from ByteBuffer, then writing them back? 【发布时间】: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 消息同时分块发送? 【参考方案1】:

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

【讨论】:

以上是关于从 ByteBuffer 读取前四个字节,然后将它们写回?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ByteBuffer 从 Socket 读取的更快方法?

Java Bytebuffer 只能顺序读取?

在 Java 中原子读取然后写入部分 ByteBuffer

如何从 ByteBuffer 中提取使用过的字节数组?

从长度为无符号整数的 ByteBuffer 中读取 UTF-8 字符串

Java bytebuffer 将三个字节转换为 int