java 检查bytebuf长度_ByteBuf分析

1. 概念

Java NIO API自带的缓冲区类功能相当有限,没有经过优化,使用JDK的ByteBuffer操作更复杂。故而Netty的作者Trustin Lee为了实现高效率的网络传输,重新造轮子,Netty中的ByteBuf实际上就相当于JDK中的ByteBuffer,其作用是在Netty中通过Channel传输数据。

2. 优势

可以自定义缓冲类型;

通过内置的复合缓冲类型,实现透明的零拷贝(zero-copy);

不需要调用flip()来切换读/写模式;

读取和写入索引分开;

方法链;

引用计数;

Pooling(池)。

3. 实现机制

ByteBuf实际上是在一个抽象的字节数组byte[]上进行读/写操作的集合。它提供了两个指针变量用来支持读写操作:readerIndex和writerIndex。下图展现了如何将一个buffer利用两个指针来划分为三个区域。

bytebufStruct.jpg

由此可见,ByteBuf真正可读取的内容长度是writerIndex - readerIndex。

围绕着读和写操作,接下来分析ByteBuf的实现逻辑。

3.1 读操作

读操作主要提供以下功能:

readByte:取1字节的内容;

readBoolean:取1字节的内容,返回readByte()!= 0;

readUnsignedByte:取1字节的内容,返回((short) (readByte() & 0xFF));(能把负数转换为无符号吗?)

readShort:取2字节的内容,返回转换后的short类型;

readUnsignedShort:取2字节的内容,返回readShort()& 0xFFFF;

readMedium:取3字节的内容,返回转换后的int类型;

readUnsignedMedium:取3字节的内容,返回转换后的int类型;

readInt:取4字节的内容;

readUnsignedInt:取4字节的内容,返回readInt()& 0xFFFFFFFFL;

readLong:取8字节的内容;

readChar:取1字节的内容;

readFloat:取4字节的int内容,转换为float类型;

readDouble:取8字节的long内容,转换为double类型;

readBytes:取指定长度的内容,返回ByteBuf类型;

readSlice:取指定长度的内容,返回By

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值