【问题标题】:How do I getInt from a ByteBuffer with only 1 remaining byte (Java NIO)如何从仅剩 1 个字节的 ByteBuffer 中获取 Int(Java NIO)
【发布时间】:2016-05-15 20:19:29
【问题描述】:

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

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

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

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

然后读取更多字节。

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

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

【问题讨论】:

  • 不不不。仔细阅读问题......这是来自套接字的数据,正在缓冲,并且整数的第一个字节被“分离”了。但是,其他字节即将到来,因此读取一个字节并转换它是错误的。 OP 想要的是保留该字节,直到知道其他 3 个字节。
  • @dcsohl 你是对的,我的错误
  • compact() 之后,缓冲区设置为能够读取更多字节。一旦读取更多字节,flip() 并读取更多。
  • 消息长度是否固定?

标签: java nio bytebuffer


【解决方案1】:
buf.compact(); 
// wrong: buf.position(buf.limit()); 
// no need to: buf.limit(buf.capacity()); 

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

设置容量限制是多余的:compact() 已经为你做了。

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    相关资源
    最近更新 更多