如何从只有 1 个剩余字节的 ByteBuffer 中获取 Int (Java NIO)

How do I getInt from a ByteBuffer with only 1 remaining byte (Java NIO)

我是 Java NIO 的新手,不确定如何以 nio 的方式做事。

假设我已经使用 ByteBuffer 的 get 方法将一些数据从套接字读取到 ByteBuffer 并消耗了除一个字节之外的所有字节。我知道接下来将是四个字节和一个二进制格式的整数,所以我想使用 getInt(),但缓冲区中只有 int 的第一个字节。

对我来说很自然的事情是用来自连接的更多字节填充缓冲区然后继续。如果我理解正确的话,我可以用

来实现
buf.compact(); 
buf.position(buf.limit()); 
buf.limit(buf.capacity()); 

然后读取更多字节。

既然没有那个行为的方法,但是有flip()方法,我想是不是我的思路错了。有更好的方法吗?

这种情况自然会发生如果连接传送长度为 + 数据消息的流。

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

请不要更改位置。 compact() 之后的位置指向缓冲区未获取部分之后的第一个字节 - 正是您想要的位置。

设置容量限制是多余的:compact() 已经为您完成了。