Netty的深入浅出--73.ByteBuf深入源码理解及与ByteBuffer的区别

博客主要介绍ByteBuf相关知识,建议用unpool方法创建。对比了ByteBuf与nio的ByteBuffer,指出ByteBuf读写操作指针分开。还阐述了ByteBuf底层存储数据方式、迭代读取数据方法,介绍了ByteBuf中重要方法,如readableBytes()、isWritable()等。

建议通过unpool的方法创建ByteBuf

ByteBuf的迭代方式

 这里和nio的bytebuffer有很大的区别,bytebuffer是通过一个postion指针和limit来同时处理读和写操作,而bytebuf则是分开,读操作使用ReaderIndex,写操作使用WriterIndex。

 理解bytebuf的底层存储数据的方式

通过迭代的方式进行数据读取

在java中一个整数占4个字节 

读取之后的数据属于discardable bytes区域中;

当调用discardReadBytes()方法之后

调用clear()方法,简单来说就是指针的重置

 在bytebuf中write方法和read方法中指针都是相对的

运行结果

 

创建下一个项目实例:

创建存放String的ByteBuf

 查看copiedbuffer的源码实现

判断bytebuf是不是以一个字节数组的形式存储 ,是的话返回true;

在堆中的缓存数据都是通过字节数组的形式,而操作系统中的缓存数据不是;

 

 

前面是编码,后面是解码

 

 我们查看一下它的类型

ridx:0      从0开始读

widx: 11   一共有11个字节,从11的位置开始写

cap:33   bytebuf的容量,底层是可以自动扩容的

 

了解ByteBuf中的重要方法

 

arrayoffset()方法

 

 

readableBytes()方法

 

 返回的是可读的字节数

所以根据readableBytes()方法我们可以这样进行遍历

 

取“张h”一共四个字节 ,完整的打印出来

其中isWritable()方法 ,isReadable()方法

 

clear()方法

 

discardReadBytes()方法

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值