java nio 里的buffer是缓存数据,通常缓冲区是一个数组,字节数组,也可以是别的类型。最常用的就是bytebuffer,
还有一些其它的类型:
charbuffer,
shortbuffer,
intbuffer,
longbuffer,
floatbuffer,
doublebufer。
一开始在知识(一)里写到,想要用nio读取数据,都是从channel读取到buffer。然后应用从buffer读取数据,同样写数据也是,先把数据写到buffer中,然后读道channel中。
基本上都是围绕这些状态变量和一些常用方法来做一些操作。
常用的状态变量:position,limit,capacity,常用这个三个变量来跟踪缓冲区的数据。
position:
当你写数据到buffer中的时候,position表示的当前位置指针,初始位置为0,最大可写入位capasity-1。例如当你写入三个字节数据的时候,position就是3,指向数组的第四个元素,下次开始写的时候,就从4开始写入。
当你读数据的时候,也是从某个位置指针开始读数据。当buffer从写模式切换到读数据的时候,position要被设置为0
limit:
当在写模式的情况下,limit表示最多能写入到哪里,最多写入到多少数据。limit等于buffer的capasity。
当在读模式的情况下,limit表示最多能读出多少数据。注意一点就是,buffer从写模式切换到读模式的情况下,limit要被切换到position位置,如果position为0,那么limit也是在0的位置。
capasity:
这个没啥好说的,就是最大容量。这个最大容量就是开始分配的,比如bytebuffer这个类型的缓冲区,Bytebuffer.allocate(100),就是分配100个字节,capasity则就出来了。
常用的方法:flip(),clear(),compact(),mark(),reset(),rewind()方法
flip():
此方法是将buffer从写模式下转换成读模式,写模式转换成读模式,需要注意的是,position要置换成到0的位置,limit要被切换到position的位置。
rewind():
是将position的位置重新设置为0。
clear()和compact()方法:
为什么要把它俩放在一起说,因为它俩容易混淆,所有一起说区别一下。
clear()方法position数据为0,会到起始位置,limit则置换到capasity位置。buffer中的数据没有被清楚,我得理解就是把所有的状态变量重置成初始化位置。不再标记哪些读过,哪些写过,这些都不会被记得。
compact()方法则是把所有buffer中未读的数据拷贝到初始处,然后position则是从未读的最后一个位置的下一个来标识。
mark()和reset()方法:
mark根据英文名就是标记的意思,标记position的位置的,reset则是重置,重置什么呢,就是mark标记完了,
buffer里常用的就是这些变量和方法。