关于从 IoArgs 向 byte 中写入的问题
来源:8-6 构建有序消息体-基本发送调度实现

磊磊要酷酷滴
2019-04-21
- 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回答
-
bytes.length - offset:byte 中能够被写入的大小;
buffer.remaining():buffer 中剩余的空间;
这两句解释都没错。对于往buffer中写入来说这样的解释没错。
对于从buffer中读取来说就有点儿问题:buffer.remaining() 此时表示的是buffer中还剩余的字节数量。
比如:buffer有10个字节,已经被读取一个,所以剩余就是9个。
bytes总共有10个字节,此时已经存储了4个进去了,还剩余6个可以被写入的区间。
所以我一次就只能读取:Math.min(6, 9); = 6.142019-04-23 -
none_nkn
2020-06-20
这里offset传入的固定是0,bytes是AsyncReceiveDispatcher中的buffer,length实际上是消息体的长度。因此这里bytes.length-offset对应每次接收一个IoArgs为StringReceivePacket都是固定为消息体长度。当消息体长度小于等于IoArgs的buffer剩余空间[position,limit],则只需读取消息体长度个字节,读取一次IoArgs即可得到完整消息。当消息体长度大于IoArgs的buffer的剩余空间,则只读取剩余空间长度个字节,读取多份IoArgs才可得到完整消息。bytes总是从0(offset)开始存储字节。以上是我个人的理解。
00
相似问题