+-------------------+------------------+------------------+
| discardable bytes | readable bytes | writable bytes |
| | (CONTENT) | |
+-------------------+------------------+------------------+
| | | |
0 <= readerIndex <= writerIndex <= capacity
NIO中,ByteBuffer用了4个属性来表示缓存区的标志,而ChannelBuffer对此进行了优化,取消了mark属性,将limit指针改成了writeIndex,更容易理解,同时,使用了zero-based indexing来表示段(segment)的类型。
具体地,ChannelBuffer有两个属性,readerIndex和writerIndex两个指针来分别控制读写;
一个ChannelBuffer被分成三个区域:discardable、readable和writeable,分别表示已经读过的内容、实际还剩下的内容、Buffer剩余的空间也就是可以写的缓冲区大小;
read和skip操作:会从readerIndex位置读取或skip指定数量的bytes,readerIndex+=size(bytes),如果读区的下标越界,抛出IndexOutOfBoundsException异常;
write操作:从writerIndex位置写入buffer指定size的bytes,writeIndex+=size(bytes),如果空间不够,抛出IndexOutOfBoundsException异常
几个常用的方法:
readable() 返回 boolean (writerIndex-readerIndex)
readableBytes() 返回int (writerIndex-readerIndex)
writeableBytes() 返回int (capacity-writerIndex)
关于discardable bytes,有一个释放discardable区域的方法:discardReadBytes()
调用 discardReadBytes()方法前后,相对于ByteBuffer,改进了flip()方法,使得空间得到更好的利用,也防止了调用flip()不当而出现的错误。
before
+-------------------+------------------+------------------+
| discardable bytes | readable bytes | writable bytes |
+-------------------+------------------+------------------+