在第一节中,简单的描述了NIO三个核心的类:channel、buffer、selector;由于缓冲区作为操作的基本,而且底层channel接口没有过多细节(只有两个方法:isOpen、close)这里先讲解缓冲区的详细内容,后面再讲解具体类型的channel和selector;
一、buffer内部细节
在上一节的简单实例中有讲到,缓冲区的读模式和写模式,为什么还会有这样来区分呢?缓冲区可以认为是一个容器,可以看做是某个类型的数组,既然是容器、数组那就应该有容量大小、下标(index),不可能无限读或者写,读写时必须有指定的下标值;
缓存区的读写模式内部其实是使用三个状态变量来控制:
- capacity
- position
- limit
(一)、状态变量
- capacity
这个状态变量表示缓冲区的容量大小,这个值是固定不变的,指向缓冲区底层数组的最后一个位置;
2. position
在读模式下,该值表示下一个读取数据的位置,通过flip方法切换为读模式时,该值为指向缓存区第一个数据位置;在写模式下,该值表示下一个要写入数据的位置,通过clear方法切换为写模式时,该值指向缓存区第一个数据位置;
3. limit
这个状态变量表示缓存区可读/写的最大位置:在写模式下,该值等于capacity;在读模式下,该值等于切换为读模式时position的位置,表示可读数据位置;
(二)、读写模式改变方法
- flip方法
改方法必须要在读取缓冲区数据前调用;flip方法将limit变量的位置设置为当前position,将position设置为0,然后就可从缓冲区读取数据;
2. clear方法
该方法必须在向缓冲区写入数据前调用;clear方法将limit变量设置为和capacity一样,将position设置为0;
3. compact方法
该方法可以作为切换写模式调用,它并不像clear方法清空整个缓冲区,只是清除已经读取过的数据,没有被读取过的数据会移动到缓冲区前面:position位置设置为 limit-position,而limit还是设置为和capacity一样;
4. rewi