Netty开篇——NIO章上(三)

Java NIO基本介绍

  1. java non-blocking I/O 称为NIO(也叫New IO)。JDK4开始提供,同步非阻塞
  2. 相关内容在 java.nio 包及子包下,对java.io 包中的很多类进行改写。
  3. 三大核心: Channel(通道),Buffer(缓冲区),Selector(选择器)
  4. NIO是面向缓冲区或者面向块编程。数据读取到一个它后处理的缓冲区,需要时可在缓冲区中前后移动,这就增加了处理过程中的灵活性,使用它可以提供非阻塞式的高伸缩性网络
  5. NIO的非阻塞模式,使一个线程从某通道发送请求或者读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据可以读取之前,该线程可以继续做其他的事情。
  6. 通俗理解: NIO 是可以做到用一个线程来处理多个操作。假设有 10000 个请求过来,根据实际情况,可以分配50 或者 100 个线程来处理。不像之前的阻塞IO 那样,非得分配 10000 个。
  7. HTTP2.0 使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比 HTTP1.1 大了好几个数量级
  8. 基本案例

NIO 和 BIO 的比较

  1. BIO以流的方式处理数据,而NIO以块的方式处理数据,I/O块的效率比I/O流高很多
  2. BIO 是阻塞的,NIO则是非阻塞的
  3. BIO 基于字节流和字符流进行操作,而NIO基于Channel(通道)和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector 选择器用于监听多个通道的事件(比如:连接请求,数据到达等),因此使用单个线程就可以监听多个客户端通道

Selector、Channel 和 Buffer 的关系图

  1. 每个channel都会对应一个Buffer
  2. 一个Selector对应一个线程
  3. 多个channel会注册到其selector
  4. Selector会根据不同的Event,在各个Channel上切换
  5. channel 是双向的,可以返回底层操作系统的情况,比如Linux,底层的操作系统通道就是双向的.
  6. Buffer是一个内存块,底层是一个数组
  7. 数据的读取写入是通过 Buffer这个和BIO有所区别,BIO 中要么是输入流,或者是输出流,不能双向,但是NIO的Buffer是可以读也可以写,需要flip()切换

 

缓冲区(Buffer)

  1. Buffer本质上是一个可以读写数据的内存块,可以理解成是一个容器对象(含数组),该对象提供了一组方法,可以更轻松地使用内存块,Buffer对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。Channel 读写的数据都必须经由Buffer
  2. Buffer是父类、抽象类,类的层级关系图
  3. 常用Buffer子类

    • ByteBuffer 存储字节数据到缓冲区
    • shortBuffer 存储字符串数据到缓冲区
    • CharBuffer 存储字符数据到缓冲区
    • IntBuffer 存储整数数据到缓冲区
    • LongBuffer 存储长整型教据到缓冲区
    • DoubleBuffer 存储小数到缓冲区
    • FloatBuffer 存储小数到缓冲区
  4. 这些Buffer都把数据存于自己类型的数组

  5. Buffer类的四个属性:
    • Capacity:容量,即可以容纳的最大数据量;在缓冲区创建时被设定并且不能改变
    • Limit:表示缓冲区的当前终点,不能对缓冲区超过极限的位置进行读写操作。且极限是可以修改的
    • Position:位置,下一个要被读写的元素的索引,每次读写缓冲区数据时都会改变改值,为下次读写做准备
    • Mark:标记

Buffer类相关方法

public abstract class Buffer{
//JDK1.4时,引入的api
public final int capacity()//返回此缓冲区的容量
public final int position()//返回此缓冲区的位置
public final Buffer position(int newPositio)//设置此缓冲区的位置
public final int limit()//返回此缓冲区的限制
public final Buffer limit(int newLimit)//设置此缓冲区的限制
public final Buffer mark()//在此缓冲区的位置设置标记
public final Buffer reset()//将此缓冲区的位置重置为以前标记的位置
public final Buffer clear()//清除此缓冲区,即将各个标记恢复到初始状态,但是数据并没有真正擦除,
public final Buffer flip()//反转此缓冲区
public final Buffer rewind()//重绕此缓冲区
public final int remaining()//返回当前位置与限制之间的元素数
public final boolean hasRemaining()//告知在当前位置和限制之间是否有元素
public abstract boolean isReadOnly()://告知此缓冲区是否为只读缓冲区
//JDK1.6时引入的api
public abstract boolean hasArray();//告知此缓冲区是否具有可访问的底层实现数组
public abstract Object array();//返回此缓冲区的底层实现数组
public abstract int arrayOffset();/返回此缓冲区的底层实现数组中第一个缓冲区元素的偏移量
public abstract boolean is Direct();//告知此缓冲区是否为直接缓冲区
}

ByteBuffer

  1. 除了boolean,其他基本类型都有一个Buffer类型与之相对应,最常用的自然是 ByteBuffer 类(二进制数据),该类的主要方法如下:
public abstract class ByteBuffer(
//缓冲区创建相关api
public static ByteBuffer allocateDirect(int capacity)//创建直接缓冲区
public static ByteBuffer allocate(int capacity)//设置缓冲区的初始容量
public static ByteBuffer wrap(byte[] array)//把一个数组放到缓冲区中使用
//构造初始化位置offset和上界length的缓冲区
public static ByteBuffer wrap(byte[] array,int offset, int length)
//缓存区存取相关API
public abstract byte get()//从当前位置position上get,get之后,position会自动+1 
public abstract byte get(int index);//从绝对位置get
public abstract ByteBuffer put(byte b);//从当前位置上添加,put之后,position会自动+1 
public abstract ByteBuffer put(int index,byte b);//从绝对位置上put

关于Buffer的注意事项和细节

  1. ByteBuffer支持类型化的put和get,数据类型必须保持一致,否则可能有 BufferUnderflowException 异常。
  2. Buffer支持转换为只读buffer,调用asReadOnlyBuffer()
  3. NIO还提供了MappedByteBuffer,可以让文件直接在内存(堆外内存) 中进行修改,而如何同步到文件由NIO来完成.
  4. NIO还支持通过多个Buffer(buffer数组)完成读写操作即 Scattering(分散)和 Gathering(合并)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/344370.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最佳实践:如何在 SoapUI 中进行 REST 服务的测试

SoapUI 频繁地被选择为 SOAP 和 REST API 的自动化测试利器,得益于其友好的用户界面,测试人员毫不费力便可校验 REST 和 SOAP 协议的 Web 服务。它尤其适用于那些需要进行复杂测试的场合。 1、设置接口 我利用了 Swagger 去设置了一批即将投入使用的接…

蓝桥杯省赛无忧 STL 课件13 list

01 list的定义和结构 以下是一个示例&#xff0c;展示如何使用listt容器: #include<bits/stdc.h> using namespace std; int main(){list<int> mylist;//在链表尾部插入元素mylist.push_back(1);mylist.push_back(2);mylist.push_back(3);//在链表头部插入元素 my…

第二证券:A股指数反弹 飞行汽车概念骤然升温

1月11日&#xff0c;A股三大指数集体反弹&#xff0c;成交量温文放大&#xff0c;北向资金午后跑步出场。盘面上&#xff0c;工作板块个股出现普涨态势。翱翔轿车、鸿蒙概念股全天走强&#xff1b;午后新能源龙头放量拉升&#xff0c;带动创业板指快速走高。 到收盘&#xff0…

典型场景解析|PolarDB分布式版如何支撑SaaS多租户?

SaaS多租户背景 很多平台类应用或系统&#xff08;如电商CRM平台、仓库订单平台等等&#xff09;&#xff0c;它们的服务模型是围绕用户维度&#xff08;这里的用户维度可以是一个卖家或品牌&#xff0c;可以是一个仓库等&#xff09;展开的。因此&#xff0c;这类型的平台业务…

.nfsxxxxxx文件无法删除

先&#xff1a; sudo apt-get update sudo apt-get install lsof然后&#xff1a; lsof 文件路径 输出&#xff1a; 37012是id号 kill -9 id号 参考文章&#xff1a; 如何删除服务器出现的.nfs文件-CSDN博客 如何删除.nfs00000xxxx文件_.nfs0000000000004cca0000002a-CSDN博…

助力工业园区作业违规行为检测预警,基于YOLOv8【n/s/m/l/x】全系列参数模型开发构建工业园区场景下作业人员违规行为检测识别系统

在很多工业园区生产作业场景下保障合规合法进行作业生产操作&#xff0c;对于保护工人生命安全降低安全隐患有着非常重要的作用&#xff0c;但是往往在实际的作业生产中&#xff0c;因为一个安全观念的淡薄或者是粗心大意&#xff0c;对于纪律约束等意思薄弱&#xff0c;导致在…

多国管理中心多语言区块链源码一元夺宝程序仿趣步奕跑/原生计步器/原生人脸识别

前后台分开的&#xff0c;后台是TP3.2的框架了。 目前把整体UI 改版黄色系风格&#xff0c;集成了一元夺宝程序&#xff0c;用户数据同步趣步&#xff0c;效果看起来很棒&#xff0c;另外加入股票走势图&#xff08;K线图&#xff09;&#xff0c;目前已经继承人脸识别&#xf…

美国安规测试UL 60335-2-3 安全标准家用和类似用途电器安全第 2-3 部分:电熨斗的特殊要求

UL 60335-2-3 安全标准家用和类似用途电器安全第 2-3 部分:电熨斗的特殊要求 本 UL 标准基于 IEC 出版物 60335-2-3:6.1 版&#xff0c;家用和类似用途电器-安全-第 2-3 部分:电熨斗的特殊要 求。 IEC 出版物 60335-2-3 版权归 IEC 所有。 本版本的发布是为了满足 UL 标准政…

掌握 Vue 响应式系统,让数据驱动视图(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

HarmonyOS应用开发学习笔记 UIAbility组件与UI的数据同步 EventHub、globalThis

1、 HarmoryOS Ability页面的生命周期 2、 Component自定义组件 3、HarmonyOS 应用开发学习笔记 ets组件生命周期 4、HarmonyOS 应用开发学习笔记 ets组件样式定义 Styles装饰器&#xff1a;定义组件重用样式 Extend装饰器&#xff1a;定义扩展组件样式 5、HarmonyOS 应用开发…

JVM基础(8)——CMS垃圾回收器

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

MES管理系统解决方案在汽配企业中的重要性

在汽车制造业中&#xff0c;MES管理系统解决方案已成为引领精益生产的关键要素。该系统专注于监控和管理汽车生产流程&#xff0c;利用实时数据分析和采集技术&#xff0c;为企业提供了提高效率、降低成本和确保高质量产品的有效手段。本文将详细介绍汽配企业MES管理系统的特点…