请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于从 IoArgs 向 byte 中写入的问题

  • bytes.length - offset:byte 中能够被写入的大小;
  • buffer.remaining():buffer 中剩余的空间;
  • 这俩有什么好比的呢?不应该是 bytes.length - offset 和 buffer 中实际占用的大小比吗?这点有些想不明白,还请老师指点迷津。
public int writeTo(byte[] bytes, int offset) {
        int size = Math.min(bytes.length - offset, buffer.remaining());
        buffer.get(bytes, offset, size);
        return size;
}

正在回答

2回答

Qiujuer 2019-04-21 23:19:28
  • bytes.length - offset:byte 中能够被写入的大小;

  • buffer.remaining():buffer 中剩余的空间;


这两句解释都没错。对于往buffer中写入来说这样的解释没错。

对于从buffer中读取来说就有点儿问题:buffer.remaining() 此时表示的是buffer中还剩余的字节数量。


比如:buffer有10个字节,已经被读取一个,所以剩余就是9个。
bytes总共有10个字节,此时已经存储了4个进去了,还剩余6个可以被写入的区间。

所以我一次就只能读取:Math.min(6, 9); = 6.

1 回复 有任何疑惑可以回复我~
  • 提问者 磊磊要酷酷滴 #1
    谢谢老师,我明白了,buffer.remaining() 在读和写的时候表示的意义是不同的,可是为什么会这样呢?好神奇呀!
    回复 有任何疑惑可以回复我~ 2019-04-21 23:33:43
  • Qiujuer 回复 提问者 磊磊要酷酷滴 #2
    其实内部原理都一样 只是解释意思不同而已。
    准确来说就是剩余可操作区间大小
    回复 有任何疑惑可以回复我~ 2019-04-21 23:41:22
  • 提问者 磊磊要酷酷滴 回复 Qiujuer #3
    哦!懂了!读的时候,position 和 limit 会分别处于有数据区的左右,两者间距离代表的就是数据实际数量。老师之前讲过buffer的结构,这会理解的更深刻了,谢谢老师的耐心讲解,老师早点休息^_^
    回复 有任何疑惑可以回复我~ 2019-04-21 23:48:28
none_nkn 2020-06-20 18:50:07

这里offset传入的固定是0,bytes是AsyncReceiveDispatcher中的buffer,length实际上是消息体的长度。因此这里bytes.length-offset对应每次接收一个IoArgs为StringReceivePacket都是固定为消息体长度。当消息体长度小于等于IoArgs的buffer剩余空间[position,limit],则只需读取消息体长度个字节,读取一次IoArgs即可得到完整消息。当消息体长度大于IoArgs的buffer的剩余空间,则只读取剩余空间长度个字节,读取多份IoArgs才可得到完整消息。bytes总是从0(offset)开始存储字节。以上是我个人的理解。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信