概述
在对多路IO复用进行实现的时候,ByteBuf这个结构是必不可少的,尽管NIO中也实现了ByteBuf,但使用起来并不是特别方便,而且有可以优化的地方。 因此,Netty在ByteBuf这一块完全是自己的一套方案,不仅使用起来方便,有着丰富的API,而且性能也是非常的出色,本篇将对ByteBuf这一组件进行学习。
ByteBuf结构
1 | /* +-------------------+------------------+------------------+ |
源码的注释很形象,这里就直接拿来用了,ByteBuf分为下面三个区间:
- [0, readerIndex) 这个区间是已经读过的数据,
- [readerIndex, writerIndex) 这个区间是可读数据区间
- [writeIndex, capacity] 这段区间是可写区间
- 还有一个变量maxCapacity, 即如果capacity不够写了,则可以扩容,最大不超过maxCapacity,默认Integer.MAX_VALUE
ByteBuf的高频API,readXxx, writeXxx, markXxx, resetXxx… 限于篇幅这里就不过多的记录用法了…
ByteBuf的分类
上面的继承关系图中间删掉了几层关系,这样看起来比较方便理解(好像也没方便到哪去…名字一个个的都那么长
从三个角度对ByeBuf分类
下面从三个角度来对ByteBuf进行分类:
- Pooled/Unpooled(是否池化)
- Unsafe(是否使用Unsafe来进行数据读写)
- Heap/Direct(是堆中内存还是直接内存)