如何在只剩下一个字节的情况下从ByteBuffer中获取getInt (Java NIO)

5

我刚接触Java NIO,不确定如何使用nio。假设我已经从套接字读取了一些数据到一个ByteBuffer中,并且使用ByteBuffer的get方法消耗了所有字节,除了一个字节。我知道下一个是四个字节的二进制整数,所以我想使用getInt(),但是只有int的第一个字节在缓冲区中。

对我来说自然的事情是从连接中填充更多的字节到缓冲区中,然后继续。如果我理解正确,我可以通过以下方式实现:

buf.compact(); 
buf.position(buf.limit()); 
buf.limit(buf.capacity()); 

然后读取更多字节。

由于没有这种行为的方法,但有flip()方法,我想知道我的想法是否正确。是否有更好的方法?

如果连接传递长度+数据消息流,则会自然发生这种情况。


不行不行不行。仔细阅读问题...这是从套接字中传入的数据,被缓冲,恰好整数的第一个字节被“分离”了。其他字节正在到来,因此读取一个字节并转换是错误的。OP想要的是保留该字节,直到知道其他3个字节。 - dcsohl
@dcsohl 你是对的,我的错误。 - Pooya
1
compact() 之后,缓冲区已经准备好可以读取更多的字节。一旦读取了更多的字节,使用 flip() 并继续读取。 - Louis Wasserman
消息长度是固定的吗? - delephin
1个回答

2
buf.compact(); 
// wrong: buf.position(buf.limit()); 
// no need to: buf.limit(buf.capacity()); 

请勿更改位置。在compact()之后,位置指向缓冲区未获取部分之后的第一个字节,正是您想要的位置。
将限制设置为容量是多余的:compact()已经为您完成了这项工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接