前言
在了解了 ByteBuffer 的原理之后,再来理解Netty 的 ByteBuf 就比较简单了。
ByteBuf 是 Netty 框架封装的数据缓冲区,区别于 position
、limit
、flip
等属性和操作来控制 ByteBuffer
的读写,ByteBuf
通过两个位置指针来协助缓冲区的读写操作,分别是readIndex
和writeIndex
。
readIndex
、writeIndex
和capacity
变量存在以下关系:
0 <= readIndex <= writeIndex <= capacity
复制代码
实现原理
初始化 ByteBuffer
时,readIndex
和 writeIndex
取值一开始都是0。如下图所示:
当执行写入数据之后,writeIndex
会增加,如下图所示:
当执行读入数据之后则会使readIndex
增加,但不会超过writeIndex
,如下图:
在读取之后,索引 0 到 readIndex
位置的区域被视为废弃字节(discard)。可以调用discardReadBytes
方法,来释放这部分空间,其作用类似于 ByteBuffer
的compact()
方法,移除无用的数据,实现缓冲区的重复利用。如下图,展示了执行discardReadBytes
后的情况,相当于可写的空间变大了。
ByteBuf 的使用案例
为了更好的理解ByteBuf
,编写了以下示例:
public class ByteBufDemo {
/**
* @param args
*/
public stat