Netty ChannelBuffer

ChannelBuffer

+-------------------+------------------+------------------+
| 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  |
+-------------------+------------------+------------------+