NIO buffer.compact和buffer.clear使用场景及其异同

9 篇文章 0 订阅

相同点:调用完compcat和clear方法之后的buffer对象一般都是继续往该buffer中写入数据的

不同点:

(1)clear是把position=0,limit=capcity等,也就是说,除了内部数组,其他属性都还原到buffer创建时的初始值,而内部数组的数据虽然没赋为null,但只要不在clear之后误用buffer.get就不会有问题,正确用法是使用buffer.put从头开始写入数据;

(2)而compcat是把buffer中内部数组剩余未读取的数据复制到该数组从索引为0开始,然后position设置为复制剩余数据后的最后一位元素的索引+1,limit设置为capcity,此时在0~position之间是未读数据,而position~limit之间是buffer的剩余空间,可以put数据。

 

使用场景:

当buffer被读取过,但想继续复用buffer时,可以执行compact把剩余未读取数据往缓冲数据前面移动,compact移动完后,可以再次使用put往该buffer里put数据,此时数据会被写到剩余数据之后。

 

看源码:当buffer被get读取了部分数据之后,还剩下position~limit之间的字节没有被读取。然后....

 public ByteBuffer compact() {

        //buffer内部数组的position~limit之间的字节移动到buffer内部数组的最开始位置。。
        //比如当前position索引位置的字节移到0位置,position+1的字节移动到1位置,以此类推,直到limit位置的移动完位置。
        System.arraycopy(hb, ix(position()), hb, ix(0), remaining());
        
        //当前position设置为剩余字节数(limit-position),即在剩余字节的最后一个字节的下一个索引。
        position(remaining());

        //limit设置为当前buffer创建时的容量capacity(内部数据的长度)
        limit(capacity());
        discardMark();
        return this;

    }

执行完压缩操作之后,当前buffer处于可写入状态了。往里put数据就是继续往剩余数据后面增加。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值