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

漂亮的网站是什么建设出来的湖州公司网站建设公司

漂亮的网站是什么建设出来的,湖州公司网站建设公司,wordpress全站301,做名片最好的网站是哪个文章目录 前言一、ByteBuf类二、ByteBuffer 实现原理2.1 ByteBuffer 写入模式2.2 ByteBuffer 读取模式2.3 ByteBuffer 写入模式切换为读取模式2.4 clear() 与 compact() 方法2.5 ByteBuffer 使用案例 总结 前言 回顾Netty系列文章#xff1a; Netty 概述#xff08;一… 文章目录 前言一、ByteBuf类二、ByteBuffer 实现原理2.1 ByteBuffer 写入模式2.2 ByteBuffer 读取模式2.3 ByteBuffer 写入模式切换为读取模式2.4 clear() 与 compact() 方法2.5 ByteBuffer 使用案例 总结 前言 回顾Netty系列文章 Netty 概述一Netty 架构设计二Netty Channel 概述三Netty ChannelHandler四ChannelPipeline源码分析五 网络数据传输的基本单位是字节缓冲区就是存储字节的容器。在存取字节时会先把字节放入缓冲区再在操作缓冲区实现字节的批量存储以提升性能。 Java NIO 提供了ByteBuffer 作为它的缓冲区但是这个类用起来过于复杂而且也有些繁琐。因此Netty 自己实现了 ByteBuf 以替代 ByteBuffer 。 本篇文章就来介绍Netty自己缓冲区的作用。 一、ByteBuf类 缓冲区可以简单理解为一段内存区域某些情况下如果程序频繁的操作一个资源如文件或数据库则性能会很低此时为了提升性能就可以将一部分数据暂时读入内存的一块区域之中以后直接从此区域中读取数据即可。因为读取内存速度会很快这样就可以提升程序的性能。 因此缓冲区决定了网络数据处理的性能。 ByteBuf 被设计为一个可从底层解决 ByteBuffer 问题并可满足日常网络应用开发需要的缓冲类型其特点如下 允许使用自定义的缓冲区类型。通过内置的复合缓冲区类型实现了透明的零拷贝。容量可以按需增长类似于 JDK 的 StringBuilder。在读和写这两种模式之间切换不需要调用 ByteBuffer 的 flip()方法正常情况下具有比 ByteBuffer 更快的响应速度。 二、ByteBuffer 实现原理 使用 ByteBuffer 读写数据一般遵循以下4个步骤。 写入数据到 ByteBuffer 。调用 flip()方法。从 ByteBuffer 中读取数据。调用clear()方法或者compact()方法。 当向 ByteBuffer 写入数据时 ByteBuffer 会记录下写了多少数据。一旦读取数据时需要通过flip()方法将 ByteBuffer 从写入模式切换到读取模式。在读取模式下可以读取之前写入 ByteBuffer 的所有数据。 一旦读完了所有数据就需要清空缓冲区让它可以再次被写入。有两种方式能清空缓冲区调用clear()方法或者compact()方法。clear()方法会清空整个缓冲区。compact()方法只会清空已经读取过的数据任何未读的数据都被移到缓冲区的起初处新写入的数据将放到缓冲区未读数据的后面。 下面是一个 Java NIO 实现 服务器端实例中使用ByteBuffe的例子 // 可写 if (key.isWritable()) {SocketChannel client (SocketChannel) key.channel();ByteBuffer output (ByteBuffer) key.attachment();output.flip();client.write(output);System.out.println(NonBlokingEchoServer - client.getRemoteAddress() output.toString());output.compact();key.interestOps(SelectionKey.OP_READ); }对于ByteBuffer其主要有五个属性markpositionlimitcapacity和array。这五个属性的作用如下 mark记录了当前所标记的索引下标。position对于写入模式表示当前可写入数据的下标对于读取模式表示接下来可以读取的数据的下标。limit对于写入模式表示当前可以写入的数组大小默认为数组的最大长度对于读取模式表示当前最多可以读取的数据的位置下标。capacity表示当前数组的容量大小。array保存了当前写入的数据。 上述变量存在以下关系 0 mark position limit capacity这几个数据中除了 array 是用于保存数据的以外这里最需要关注的是positionlimit和capacity三个属性因为对于写入和读取模式这三个属性的表示的含义大不一样。 2.1 ByteBuffer 写入模式 如下图所示为初始状态和写入3个字节之后positionlimit和capacity三个属性的状态 从图中可以看出在写入模式下 limit指向的始终是当前可最多写入的数组索引下标。position指向的则是下一个可以写入的数据的索引位置。capacity则始终不会变化即为数组大小。 2.2 ByteBuffer 读取模式 假设我们按照上述方式在初始长度为6的 ByteBuffer 中写入了三个字节的数据此时我们将模式切换为读取模式那么这里的positionlimit和capacity则变为如下形式 可以看到当切换为读取模式之后 limit则指向了最后一个可读取数据的下一个位置表示最多可读取的数据。 position则指向了数组的初始位置表示下一个可读取的数据的位置。 capacity还是表示数组的最大容量。 这里当我们一个一个读取数据的时候position就会依次往下切换当与limit重合时就表示当前ByteBuffer中已没有可读取的数据了。 2.3 ByteBuffer 写入模式切换为读取模式 读写切换时要调用flip()方法。flip()方法的核心源码如下 public final Buffer flip() {limit position;position 0;mark -1;return this; }从上述源码可以看出执行flip()后将limit设置为position然后将该position设置为0。 2.4 clear() 与 compact() 方法 一旦读取完 ByteBuffer 中的数据需要让 ByteBuffer 准备好再次被写入。可以通过clear()或compact()方法来完成。 如果调用的是clear()方法position将被设置为0limit将被设置为capacity的值。换句话说ByteBuffer 被清空了。ByteBuffer 中的数据并未清除只是这些标记告诉我们可以从哪里开始往 ByteBuffer 里写数据。 如果 ByteBuffer 中有一些未读的数据调用clear()方法数据将被遗忘意味着不再有任何标记标注哪些数据被读过哪些还没有。 clear()方法的核心源码如下 public final Buffer clear() {position 0;limit capacity;mark -1;return this; }如果 ByteBuffer 中仍有未读的数据且后续还需要这些数据但是此时想要先写些数据那么使用compact()方法。 compact()方法将所有的未读的数据复制到 ByteBuffer 起始处。然后将 position 设置到最后一个未读元素的后面。limit属性依然像clear()方法一样设置成capacity。现在 ByteBuffer 准备好写数据了但是不会覆盖未读的数据。 compact()方法核心源码如下 public ByteBuffer compact() {int pos position();int lim limit();assert (pos lim);int rem (pos lim ? lim - pos : 0);unsafe.copyMemory(ix(pos), ix(0), (long)rem 0);position(rem);limit(capacity());discardMark();return this;}2.5 ByteBuffer 使用案例 为了更好的理解 ByteBuffer 我们来看一些示例 public class ByteBufferDemo {public static void main(String[] args) {// 创建一个缓冲区ByteBuffer buffer ByteBuffer.allocate(10);System.out.println(------------初始时缓冲区------------);printBuffer(buffer);// 添加一些数据到缓冲区中System.out.println(------------添加数据到缓冲区------------);String s love;buffer.put(s.getBytes());printBuffer(buffer);// 切换成读模式System.out.println(------------执行flip切换到读取模式------------);buffer.flip();printBuffer(buffer);// 读取数据System.out.println(------------读取数据------------);// 创建一个limit()大小的字节数组(因为就只有limit这么多个数据可读)byte[] bytes new byte[buffer.limit()];// 将读取的数据装进我们的字节数组中buffer.get(bytes);printBuffer(buffer);// 执行compactSystem.out.println(------------执行compact------------);buffer.compact();printBuffer(buffer);// 执行clearSystem.out.println(------------执行clear清空缓冲区------------);buffer.clear();printBuffer(buffer);}/*** 打印出ByteBuffer的信息* * param buffer*/private static void printBuffer(ByteBuffer buffer) {System.out.println(mark buffer.mark());System.out.println(position buffer.position());System.out.println(limit buffer.limit());System.out.println(capacity buffer.capacity());} }输出结果 ------------初始时缓冲区------------ markjava.nio.HeapByteBuffer[pos0 lim10 cap10] position0 limit10 capacity10 ------------添加数据到缓冲区------------ markjava.nio.HeapByteBuffer[pos4 lim10 cap10] position4 limit10 capacity10 ------------执行flip切换到读取模式------------ markjava.nio.HeapByteBuffer[pos0 lim4 cap10] position0 limit4 capacity10 ------------读取数据------------ markjava.nio.HeapByteBuffer[pos4 lim4 cap10] position4 limit4 capacity10 ------------执行compact------------ markjava.nio.HeapByteBuffer[pos0 lim10 cap10] position0 limit10 capacity10 ------------执行clear清空缓冲区------------ markjava.nio.HeapByteBuffer[pos0 lim10 cap10] position0 limit10 capacity10Process finished with exit code 0总结 本文首先展示了ByteBuffer在写入模式和读取模式下内部的一个状态然后分析了clear() 与 compact() 方法的源码最后讲解了ByteBuffer的使用案例。 下节我们再来分析ByteBuf实现原理。
http://www.hkea.cn/news/14300413/

相关文章:

  • 陕西省住房和建设厅网站wordpress 导出数据库
  • 化妆网站建设的目的企业网站优化服务
  • 巫山那家做网站东莞网站建设推广公司
  • 制作网站首页分为哪几部分提供坪山网站建设
  • 网站后台用什么做手机端尺寸
  • 筑巢网站后台管理系统引流软件有哪些
  • 网站建设设计图图片wordpress 抓取微信
  • 丽水市建设监理协会网站在哪里怎样做网站个人简介
  • 如何建立一个视频网站凡科建设网站步骤
  • 自学网站开发难吗个人怎么开通微信小程序
  • 夜间正能量网站网站为什么吸引人
  • 合格的网站设计师需要会什么软件建筑人才网app下载
  • 美食网站建设的背景网站建设费用什么意思
  • 动漫做a视频网站有哪些wordpress无广告视频
  • 博客网站开发教程软件开发合同模板范本1
  • 前后端分离企业网站源码少儿编程课
  • 完全自定义纯代码打造你的wordpress站点侧边栏福州鼓楼区建设局网站
  • 网站站点是什么?如何创建站点?外贸网站分析
  • 合肥网站建设过程固原网站制作
  • 电脑上建设银行网站打不开网站配色 绿色
  • 杭州 企业门户网站建设软文世界官网
  • 免费建网站的谢岗网站仿做
  • 工商银行建设银行招商银行网站小程序开发代理
  • 网站开发需要营销型网站要点
  • 有备案号的网站是公司的吗汕头企业网站
  • 大型的建设工程类考试辅导网站长春网络公司合作
  • 美橙建站五合一建站套餐申请wordpress如何开发手机版
  • 本地做网站绑定域名怎么做网页的超链接
  • 企业建设网站注意事项施工企业在施工过程中发现设计文件和图纸有差错的应当
  • wordpress怎么编辑网站建设网站赚的是什么钱