Netty ByteBuf

165 阅读1分钟

简介

ByteBuf是Netty的数据容器;Java NIO提供了ByteBuffer作为字节容器,Netty 的 ByteBuffer 替代品是ByteBuf。相对于JDK的ByteBuffer他的使用更简单,可以同事进行读写操作。

优点:

  1. 通过内置的复合缓冲区类型实现了透明的零拷贝。
  2. 容量可以按需增长。
  3. 在读和写这两种模式之间切换不需要调用ByteBuffer的flip()方法。
  4. 读和写使用了不同的索引。
  5. 支持引用计数。
  6. 支持池化。

结构

每一个ByteBuf都有一个可容纳的字节上限叫capacity。在ByteBuf中通过两个指针readerIndex和writerIndex将整个个ByteBuf划分成3个部分,分别是已丢弃部分、可读部分和可写部分,示意图如下。

+----------------------------+---------------------------+---------------------------+
|            已丢弃           |           可读            |           可写            |
|                            |          (内容)            |                          |
+----------------------------+---------------------------+---------------------------+
0           <=          readerIndex       <=        writerIndex        <=         capacity

readerIndex、writerIndex和capacity之间满足简单地数学关系0 <= readerIndex <= writerIndex <= capcity。

操作

  1. 写数据的过程会引起writerIndex的移动,writerIndex移动的最大值为capacity,写数据的过程中readerIndex保持不变。
  2. 读数据的过程会引起readerIndex的移动,readerIndex的最大值为writerIndex,在读数据的过程中writerIndex保持不变,已经被读取过的部分就成了已丢弃部分。

总结

ByteBuf通过引入读索引readerIndex和写索引writerIndex可以不用调用flip方法来同时进行读写操作。相对于JDK的ByteBuffer,使用更简单,功能更强大。