netty byteBuf (二)
netty重新定义了byteBuf 而没使用jdk byteBuffer
netty byteBuf与jdk byteBuffer的区别
(1)jdk buffer长度固定 byteBuf超过最大索引 将会扩容。(最大值默认值是Integer.MAXVALUE)
(4)读取和写入的索引分开了(readIndex/WriterIndex),不像JDK中使用一个索引
优点:
jdk 读写都是一个索引 节省了变量 读时都需要调用flip切换 写入时需要clear清空 读时不能写(nettyBuf反之)
(5)基于对象池
避免频繁的gc 内部维护一个 内存池可以频繁的利用创建buffer
netty中的byteBuf的几种类型
heapBuffer(堆缓冲区)
ByteBuf将数据存储在JVM的堆空间,通过将数据存储在数组中实现的。
1)堆缓冲的优点是:由于数据存储在JVM的堆中可以快速创建和快速释放,并且提供了数组的直接快速访问的方法。
2)堆缓冲缺点是:每次读写数据都要先将数据拷贝到直接缓冲区再进行传递。
directBuffer(直接缓存区)
优点: 因为数据直接在内存中 不会存在将数据拷贝到直接缓冲区的步骤。
缺点 :因为在直接内存中分配和释放空间会更慢
composite Buffer(复合缓冲区类型)
将多个缓存区组合成一个缓冲区。而不是创建一个缓冲区 将多个缓存区的数据复制到这个缓冲区
//组合缓冲区 CompositeByteBuf compBuf = Unpooled.compositeBuffer(); //堆缓冲区 ByteBuf heapBuf = Unpooled.buffer(8); //直接缓冲区 ByteBuf directBuf = Unpooled.directBuffer(16); //添加ByteBuf到CompositeByteBuf compBuf.addComponents(heapBuf, directBuf); //删除第一个ByteBuf compBuf.removeComponent(0); Iterator<ByteBuf> iter = compBuf.iterator(); while(iter.hasNext()){ System.out.println(iter.next().toString()); } //使用数组访问数据 if(!compBuf.hasArray()){ int len = compBuf.readableBytes(); byte[] arr = new byte[len]; compBuf.getBytes(0, arr); }
ByteBuf读写操作
public static void main(String[] args) { //创建一个16字节的buffer,这里默认是创建heap buffer ByteBuf buf = Unpooled.buffer(16); //写数据到buffer for(int i=0; i<16; i++){ buf.writeByte(i+1); } //读数据 for(int i=0; i<buf.capacity(); i++){ System.out.print(buf.getByte(i)+", "); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!