buffer.flip()方法

buffer.flip()方法

简述

简言之,反转缓冲区写后读;用于buffer缓存对象内容填写后,转为读模式。(写进buffer后再flip(),可以读出buffer中的数据)

玩法

这东西的玩法,需要理解Buffer这抽象类,是可读写的API,他里面有四个关键的概念,position,limit,mark,capacity
中文就叫位置,限制,标记,容量,他们的关系0<=mark<=position<=limit<capacity;Buffer抽象类又有几个子类,包括ByteBuffer,CharBuffer等,当然这些家伙也是抽象类,不能实例化。查看他们的静态方法,获取对象:
allocate和allocateDiret,分配指定大小的数组
在这里插入图片描述

wrap静态方法,很明显,wrap方法传入就是一个数组,在数组的基础上,咱们开始看,
在这里插入图片描述

他们底层操作的实际上就是数组(直接分配内存的,情况比较复杂,这里知道底层是数组,就能理解flip方法了)。上面的几个参数,其实就是操作数组时标记,或者就是数组的标记。capacity可以理解为数组的大小,position就是读取或写入时的下标,limit就是执行当前读或者写的最大下标;所以很明显limit一定小于capacity,position肯定不能超过设定最大下标limit。还有一个mark,可以理解为一个备份点。使用reset()方法,就可以回到这个点(不深入讨论这个点,后面补充一个mark的)。

上面说过,他是可读写的。
例如先在数组中填写数据,在0,和1中已经填写了数据;position的下标已经是2了,position是指向读写位置的,如果直接去读取buffer的内容就是从2开始,实际上2后面就没有东西(有默认值,但不是存储的数据),这个时候,flip就有用了。flip的源码如下:

public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
    }

在这里插入图片描述
首先把读取数据的最大下标设定为刚刚写的position的位置,然后position从头(0)开始,这样读取缓存的数据的时候,就会读取到刚刚写入的数据。
这就是buffer利用这四个特效,巧妙操作数组,实现读写能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值