Netty(八)——ByteBuf功能之说

87 篇文章 8 订阅
17 篇文章 1 订阅
本文详细介绍了Netty中的ByteBuf,对比了它与JDK ByteBuffer的区别,如自动扩容、丰富的读写操作、可废弃空间管理等功能。内容包括ByteBuf的工作原理、顺序读写、readerIndex和writerIndex、可读空间与可写空间、清除操作、标记与重置、查找操作、派生缓冲区、转换为ByteBuffer以及随机读写等。
摘要由CSDN通过智能技术生成

       前边说了Netty的一些基本使用,还有Server和Client的创建流程的分析,接下来的几篇博客,来看看Netty NIO相关的主要接口和模块的API功能,这篇和下篇先来看看里边核心的ByteBuf,由于东西比较多,这篇先来看看ByteBuf的功能,下篇说ByteBuf的源码实现。

       好,当我们数据传输的时候,往往都需要缓冲区,ByteBuf就是Netty提供使用的,类似JDK的Buffer,但是比它的功能更加强大,例如:1,ByteBuffer长度固定,需要我们编码进行控制;2,ByteBuffer只有一个标识位置的指针position,读写操作的时候需要手工调用flip()、clear()、rewind()等来进行操作;3,ByteBuffer的API功能有限,一些高级和实用的特性支持不够好,需要自己实现……  而Netty提供的ByteBuf则进行在JDK ByteBuffer的基础上完善了这些功能。下边来看具体的知识。先看下这张思维导图吧:

       一,首先,还是看下ByteBuffer的工作原理,先看几个核心概念:byte[] buff:buff即内部用于缓存的数组;position:当前读取的位置;mark:为某一读过的位置做标记,便于某些时候回退到该位置;capacity:初始化时候的容量;limit:读写的上限,limit<=capacity。好,下边看图:

      二,下边看Netty的ByteBuf的工作原理,它和ByteBuffer的不同主要体现在position,改为了writeIndex和readIndex,而且它的put方法做了自动扩容功能,我们看图它是如何工作的:

       三,我们看下ByteBuf的常用的功能。

       1,顺序读操作(read),就是从ByteBuf中进行读数据,包括不同返回的数据类型,不同索引,不同长度的读取等功能非常丰富。

       2,顺序写操作(write),就是向ByteBuf进行写数据,包括写入不同类型boolean,int,long,ByteBuf,byte[]等,以及写入后writerIndex的操作,还有在指定的索引写入指定length的数据,功能也是非常丰富。

       3,readerIndex和writerIndex上边讲原理的应该已经和清楚了,它就是将byteBuffer中的position分开了,还是很容易理解的。

       4,Discardable byte,相比于其他的Java对象,缓冲区的分配和释放是个耗时的操作,因此有了Discardable bytes 即可废弃空间,通过discardReadBytes操作,可以进行原理图中的释放空间,进行重复利用缓存。但是此操作,可以看出对字节数组进行了内存复制,也是消耗性能,是一种牺牲性能换取更多可用内存的操作。

       5,Readable bytes和Writable bytes,即可读空间、可写空间,Readable bytes为实际存储数据的区域,Writable bytes为尚未被使用的空闲空间。写入数据如果空间不够会进行自动扩容。下篇看源码看吧

       6,Clear操作,和Jdk ByteBuffer的clear操作一样,他并不会清空缓存区内容本事,主要是用来还原操作位置指针 。原理图很明显的。

       7,Mark和Reset,当对缓存进行读操作,由于某种原因,可能需要对之前的操作进行回滚。ByteBuf提供了:a,markReaderIndex:将当前的readerIndex备份到markedReaderIndex中;b,resetReaderIndex:将当前的readerIndex设置为markedReaderIndex;c,markWriterIndex:将当前的writerIndex备份到markedWriterIndex;d,resetWriterIndex:将当前的writerIndex设置为markedWriterIndex。

       8,查找操作:例如indexOf、bytesBefore、forEachByte等各种方法,来帮助我们查找一些常用值,例如回车换行符、分隔符等。而Netty也为我们在ByteBufProcessor中抽象了这些常用值。

       9,Derived buffers,类似数据库的视图,ByteBuf提供了多个接口用户创建某个ByteBuf的视图或者进行复制,例如:duplicate、copy、slice等。

       10,转换成标准的ByteBuffer,由于底层JDK进行网络读写的时候都是使用的ByteBuffer,所以ByteBuf提供(也必须)两者的各种相互转换,例如:nioBuffer(),还有有参方法。

       11,随机读写(set和get),除了顺序读写之外,ByteBuf还支持随机读写,即可以随机指定读写的索引位置。

       好上边讲了ByteBuf的工作原理和功能介绍,当然具体的方法,我们可以参考ByteBuf的API文档说明(https://netty.io/4.1/api/index.html)  ByteBuf是非常重要的 知识,下篇我们讲结合这些功能看看源码的实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值