Netty之ByteBuf相关
概述
网络数据的基本单位总是字节。Java NIO 提供了ByteBuffer 作为它的字节容器,但是这个类使用起来过于复杂,而且也有些烦琐。
Netty 的ByteBuffer 替代品是ByteBuf,一个强大的实现,既解决了JDK API 的局限性,又为网络应用程序的开发者提供了更好的API。
优点
- 它可以被用户自定义的缓冲区类型扩展
- 通过内置的复合缓冲区类型实现了透明的零拷贝;
- 容量可以按需增长;
- 在读和写这两种模式之间切换不需要调用额外flip()的方法;
- 读和写使用了不同的索引
- 支持方法的链式调用;
- 支持引用计数;
- 支持池化。
ByteBuf类

ByteBuf是一个抽象类。
ReferenceCounted:
- 对象的初始引用计数为 1 。
- 当引用计数器值为 0 时,表示该对象不能再被继续引用,只能被释放。
工作方式
- readerIndex ,读索引。
- writerIndex ,写索引。
- capacity ,当前容量。
- maxCapacity ,最大容量。

当 writerIndex 写入超过 capacity 时,可自动扩容。每次扩容的大小,为 capacity 的 2 倍。当然,前提是不能超过 maxCapacity 大小。
ByteBuf 通过 readerIndex 和 writerIndex 两个索引,解决 ByteBuffer 的读写模式的问题。
使用模式
- 堆缓冲区
最常用的ByteBuf 模式是将数据存储在JVM 的堆空间中。这种模式被称为支撑数组(backing array),它能在没有使用池化的情况下提供快速的分配和释放。可以由hasArray()来判断检查ByteBuf 是否由数组支撑。适合有遗留数据需要处理的情况。

- 直接缓冲区
直接缓冲区避免了I/O前后将缓冲区的内容复制到一个中间缓冲区,适用于网络数据传输。它的主要缺点是,相对于基于堆的缓冲区,它们的分配和释放都较为昂贵。而且不适合用来处理遗留代码:

- 复合缓冲区
它为ByteBuf提供了一个聚合视图,可以根据你的需要添加或删除ByteBuf实例。
通过ByteBuf子类——CompositeByteBuf来实现这个模式,它将多个缓冲区合

最低0.47元/天 解锁文章
781

被折叠的 条评论
为什么被折叠?



