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

时间:2016-02-05 18:37:36

标签: java nio bytebuffer

我是Java NIO的新手,并且不确定如何做任何事情。

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

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

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

然后读取更多字节。

由于没有具有该行为的方法,但有flip()方法,我想知道我的想法是否错误。有更好的方法吗?

这种情况自然会发生,例如如果连接提供长度+数据消息流。

1 个答案:

答案 0 :(得分:2)

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

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

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