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利用这四个特效,巧妙操作数组,实现读写能力。