从 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 读取的更快方法?