Netty中的ByteBuf原理分析

来源:互联网 发布:农业普查数据 编辑:程序博客网 时间:2024/06/05 00:19

我们在进行数据传输的时候往往是需要缓冲区的,如在jdk1.7中提供了Buffer系列类库。这个类库中针对java的七种基本类型都有自己的换成去实现。但是在NIO编程中,我们用的最多的还是ByteBuffer,它基本可以满足我们的要求。但是在复杂的NIO编程中还有有很多局限性。下面我们就来看看ByteBuffer的缺点:
*(1)ByteBuffer的长度是固定的,一但创建了ByteBuffer,它就不能进行动态的扩容和收缩,当需要编码大的对象的时候,就会出现索引出界。
(2)ByteBuffer只有一个标志位置position,在进行读写切换的时候必须调用flip()或者rewind()等函数,所以必须小心的处理这些API,否则就很容易出错。
(3)ByteBuffer的API功能是有限的,一些高级的特性是不支持的,需要自己编程来实现。*

为了弥补以上的不足,Netty就提供了自己的ByteBuffer实现。
Netty中的ByteBuf和JDK中的ByteBuffer实现原理基本是一致的,提供了一下几类基本功能:
设置网络字节序
构造缓冲区实例
操作位置指针
缓冲区自身的copy和slice等
其次就是增加了额外的功能来弥补JDK中ByteBuffer的缺点。
如针对第二个缺点:增加了readIndex和writeIndex两个标志位来实现读写分离。
针对无法动态扩容的缺点:通常在进行put操作的时候先检查剩余空间,如果空间不足,就重新创建一个新的,并将旧的内容拷贝到新的空间去,然后释放老的空间。

具体详细的内容请参考Netty权威指南第十五章ByteBuf及其辅助类的分析

0 0