简介
ByteBuf是Netty的数据容器;Java NIO提供了ByteBuffer作为字节容器,Netty 的 ByteBuffer 替代品是ByteBuf。相对于JDK的ByteBuffer他的使用更简单,可以同事进行读写操作。
优点:
- 通过内置的复合缓冲区类型实现了透明的零拷贝。
- 容量可以按需增长。
- 在读和写这两种模式之间切换不需要调用ByteBuffer的flip()方法。
- 读和写使用了不同的索引。
- 支持引用计数。
- 支持池化。
结构
每一个ByteBuf都有一个可容纳的字节上限叫capacity。在ByteBuf中通过两个指针readerIndex和writerIndex将整个个ByteBuf划分成3个部分,分别是已丢弃部分、可读部分和可写部分,示意图如下。
+----------------------------+---------------------------+---------------------------+
| 已丢弃 | 可读 | 可写 |
| | (内容) | |
+----------------------------+---------------------------+---------------------------+
0 <= readerIndex <= writerIndex <= capacity
readerIndex、writerIndex和capacity之间满足简单地数学关系0 <= readerIndex <= writerIndex <= capcity。
操作
- 写数据的过程会引起writerIndex的移动,writerIndex移动的最大值为capacity,写数据的过程中readerIndex保持不变。
- 读数据的过程会引起readerIndex的移动,readerIndex的最大值为writerIndex,在读数据的过程中writerIndex保持不变,已经被读取过的部分就成了已丢弃部分。
总结
ByteBuf通过引入读索引readerIndex和写索引writerIndex可以不用调用flip方法来同时进行读写操作。相对于JDK的ByteBuffer,使用更简单,功能更强大。