当前位置: 首页 > news >正文

南昌易动力网站建设公司/电脑优化大师哪个好

南昌易动力网站建设公司,电脑优化大师哪个好,企业简介画册,大连网站建设设计公司目录 前言 实现原理 ByteBuf 的使用案例 ByteBuf 的3种使用模式 堆缓冲模式 直接缓冲区模式 复合缓冲区模式 总结 前言 在了解了 ByteBuffer 的原理之后,再来理解Netty 的 ByteBuf 就比较简单了。 ByteBuf 是 Netty 框架封装的数据缓冲区,区别…

目录

前言

实现原理

ByteBuf 的使用案例

ByteBuf 的3种使用模式

堆缓冲模式

直接缓冲区模式

复合缓冲区模式

总结


前言

在了解了 ByteBuffer 的原理之后,再来理解Netty 的 ByteBuf 就比较简单了。

ByteBuf 是 Netty 框架封装的数据缓冲区,区别于 positionlimitflip等属性和操作来控制 ByteBuffer 的读写,ByteBuf 通过两个位置指针来协助缓冲区的读写操作,分别是readIndexwriteIndex

readIndexwriteIndexcapacity变量存在以下关系:

0 <= readIndex <= writeIndex <= capacity

io.netty学习使用汇总 

实现原理

初始化 ByteBuffer 时,readIndex 和 writeIndex 取值一开始都是0。如下图所示:

当执行写入数据之后,writeIndex会增加,如下图所示:

当执行读入数据之后则会使readIndex增加,但不会超过writeIndex,如下图:

在读取之后,索引 0 到 readIndex位置的区域被视为废弃字节(discard)。可以调用discardReadBytes方法,来释放这部分空间,其作用类似于 ByteBuffercompact()方法,移除无用的数据,实现缓冲区的重复利用。如下图,展示了执行discardReadBytes后的情况,相当于可写的空间变大了。

ByteBuf 的使用案例

为了更好的理解ByteBuf,编写了以下示例:

public class ByteBufDemo {/*** @param args*/public static void main(String[] args) {// 创建一个缓冲区ByteBuf buffer = Unpooled.buffer(10);System.out.println("------------初始时缓冲区------------");printBuffer(buffer);// 添加一些数据到缓冲区中System.out.println("------------添加数据到缓冲区------------");String s = "love";buffer.writeBytes(s.getBytes());printBuffer(buffer);// 读取数据System.out.println("------------读取数据------------");while (buffer.isReadable()) {System.out.println(buffer.readByte());}printBuffer(buffer);// 执行compactSystem.out.println("------------执行discardReadBytes------------");buffer.discardReadBytes();printBuffer(buffer);// 执行clearSystem.out.println("------------执行clear清空缓冲区------------");buffer.clear();printBuffer(buffer);}/*** 打印出ByteBuf的信息* * @param buffer*/private static void printBuffer(ByteBuf buffer) {System.out.println("readerIndex:" + buffer.readerIndex());System.out.println("writerIndex:" + buffer.writerIndex());System.out.println("capacity:" + buffer.capacity());}
}

输出结果:

------------初始时缓冲区------------
readerIndex:0
writerIndex:0
capacity:10
------------添加数据到缓冲区------------
readerIndex:0
writerIndex:4
capacity:10
------------读取数据------------
108
111
118
101
readerIndex:4
writerIndex:4
capacity:10
------------执行discardReadBytes------------
readerIndex:0
writerIndex:0
capacity:10
------------执行clear清空缓冲区------------
readerIndex:0
writerIndex:0
capacity:10Process finished with exit code 0

对比ByteBufferByteBuf两个示例可以看出,Netty 提供了更加方便地创建ByteBuf的工具(unpooled),同时,也不必再执行flip()方法来切换读写模式。对比而言,ByteBuf更加易于使用。

ByteBuf 的3种使用模式

ByteBuf 共有三种使用模式:堆缓冲区模式(Heap Buffer)、直接缓冲区模式(Direct Buffer)和 复合缓冲区模式(Composite Buffer)。

堆缓冲模式

堆缓冲区模式又称为支撑数组,其数据是存放在JVM的堆空间,通过将数据存储在数组中实现。

优点:数据存储在JVM堆中可以快速的创建和快速释放,并且提供了数据快速访问的方法;

缺点:每次数据与 I/O 进行传输时,都需要将数据复制到直接缓冲区。

以下是堆缓冲区的代码示例:

public class ByteBufHeapBufferDemo {/*** @param args*/public static void main(String[] args) {// 创建一个堆缓冲区ByteBuf buffer = Unpooled.buffer(10);String s = "waylau";buffer.writeBytes(s.getBytes());// 检查是否是支撑数组if (buffer.hasArray()) {// 获取支撑数组的引用byte[] array = buffer.array();// 计算第一个字节的偏移量int offset = buffer.readerIndex() + buffer.arrayOffset();// 可读字节数int length = buffer.readableBytes();printBuffer(array, offset, length);}}/*** 打印出Buffer的信息* * @param buffer*/private static void printBuffer(byte[] array, int offset, int len) {System.out.println("array:" + array);System.out.println("array->String:" + new String(array));System.out.println("offset:" + offset);System.out.println("len:" + len);}
}

输出结果:

array:[B@5b37e0d2
array->String:waylau    
offset:0
len:6Process finished with exit code 0

直接缓冲区模式

直接缓冲区属于堆外分配的直接内存,不会占用堆得空间。

优点:使用 socket 传输数据时性能很好,避免了数据从 JVM 堆内存复制到直接缓冲区的过程,提高了性能。

缺点:相对于堆缓冲区而言,直接缓冲区分配内存空间和释放更为昂贵。

对于涉及大量的 I/O 数据的读写,建议使用直接缓冲区。而对于用于后端业务消息编解码模块,建议使用堆缓冲区。

以下是直接缓冲区代码示例:

public class ByteBufDirectBufferDemo {/*** @param args*/public static void main(String[] args) {// 创建一个直接缓冲区ByteBuf buffer = Unpooled.directBuffer(10);String s = "waylau";buffer.writeBytes(s.getBytes());// 检查是否是支撑数组.// 不是支撑数组,则为直接缓冲区if (!buffer.hasArray()) {// 计算第一个字节的偏移量int offset = buffer.readerIndex();// 可读字节数int length = buffer.readableBytes();// 获取字节内容byte[] array = new byte[length];buffer.getBytes(offset, array);printBuffer(array, offset, length);}}/*** 打印出Buffer的信息* * @param buffer*/private static void printBuffer(byte[] array, int offset, int len) {System.out.println("array:" + array);System.out.println("array->String:" + new String(array));System.out.println("offset:" + offset);System.out.println("len:" + len);}
}

输出结果:

array:[B@6d5380c2
array->String:waylau
offset:0
len:6Process finished with exit code 0

复合缓冲区模式

复合缓冲区是 Netty 特有的缓冲区。本质上类似于提供一个或多个 ByteBuf 的组合视图,可以根据需要添加和删除不同类型的 ByteBuf

优点:提供了一种访问方式让使用者自由地组合多个ByteBuf,避免了复制和分配新的缓冲区。

缺点:不支持访问其支撑数组。因此如果要访问,需要先将内容复制到堆内存中,再进行访问。

以下示例是复合缓冲区将堆缓冲区和直接缓冲区组合在一起,没有进行任何复制过程,仅仅创建了一个视图而已。

public class ByteBufCompositeBufferDemo {/*** @param args*/public static void main(String[] args) {// 创建一个堆缓冲区ByteBuf heapBuf = Unpooled.buffer(3);String way = "way";heapBuf.writeBytes(way.getBytes());// 创建一个直接缓冲区ByteBuf directBuf = Unpooled.directBuffer(3);String lau = "lau";directBuf.writeBytes(lau.getBytes());// 创建一个复合缓冲区CompositeByteBuf compositeBuffer = Unpooled.compositeBuffer(10);compositeBuffer.addComponents(heapBuf, directBuf); // 将缓冲区添加到符合缓冲区// 检查是否是支撑数组.// 不是支撑数组,则为复合缓冲区if (!compositeBuffer.hasArray()) {for (ByteBuf buffer : compositeBuffer) {// 计算第一个字节的偏移量int offset = buffer.readerIndex();// 可读字节数int length = buffer.readableBytes();// 获取字节内容byte[] array = new byte[length];buffer.getBytes(offset, array);printBuffer(array, offset, length);}}}/*** 打印出Buffer的信息* * @param buffer*/private static void printBuffer(byte[] array, int offset, int len) {System.out.println("array:" + array);System.out.println("array->String:" + new String(array));System.out.println("offset:" + offset);System.out.println("len:" + len);}
}

输出结果:

array:[B@4d76f3f8
array->String:way
offset:0
len:3
array:[B@2d8e6db6
array->String:lau
offset:0
len:3Process finished with exit code 0

CompositeByteBuf是一个虚拟的缓冲区,其用途是将多个缓冲区显示为单个合并缓冲区,类似数据库中的视图。

总结

通过以上对于ByteBuf的介绍,相信小伙伴们对于ByteBuf的原理也有了一定的了解。下一节我们继续深入Netty的源码。

http://www.jmfq.cn/news/5192371.html

相关文章:

  • 网站建设属于什么服务/怎么免费给自己建网站
  • 房产网站哪个比较真实/营销策略分析包括哪些内容
  • b2b建设网站公司/新seo排名点击软件
  • 做的网站需要什么技术/九幺seo优化神器
  • 梵克雅宝中文官网/武汉seo公司排名
  • 网站开发做原型吗/浙江seo公司
  • 网站设计要素/广州网站建设方案维护
  • 外销网站建立/南宁百度seo优化
  • 国外设计有名网站/营销型企业网站
  • 找公司做网站建设靠谱吗/网站建设推广公司
  • 自己怎么做机构网站/广告信息发布平台
  • wordpress 信息网站/自己的网站
  • 电商网站设计公司力推亿企邦/网站推广优化怎样
  • 网站用什么格式的图片格式/百度风云榜小说排行榜
  • 韶关营销网站开发/网络推广竞价是什么
  • 域名过期做的网站怎么办/培训机构加盟店排行榜
  • 如何做网站竞价排名/网络平台有哪些?
  • 动漫做a视频网站有哪些/郑州seo优化外包顾问
  • 网络营销网站类型/秦皇岛seo招聘
  • 庆阳官网贴吧/优化疫情政策
  • 网站联盟是什么/郑州seo顾问阿亮
  • 最牛的科技网站建设/营销型网站建设推广
  • 西宁市建设局官方网站/优化搜狗排名
  • 甘肃建设厅网站执业注册中心/搜索引擎营销方法主要有三种
  • 广州网站建设知名乐云seo/网络营销做得好的企业有哪些
  • 房地网站制作/爱网
  • 做web网站/最大的搜索网站排名
  • 弹幕网站如何做/google关键词seo
  • 网站后台管理 源码/百度竞价可以自学吗
  • 做网站卖多少钱一个/网站建设网络公司