千家信息网

什么是NIO

发表于:2025-02-22 作者:千家信息网编辑
千家信息网最后更新 2025年02月22日,本篇内容介绍了"什么是NIO"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!NIO( No-block
千家信息网最后更新 2025年02月22日什么是NIO

本篇内容介绍了"什么是NIO"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

NIO( No-blocking I/O)顾名思义他是非阻塞的(其实 可以设置阻塞与非阻塞两种模式 ) ,普通的IO流是阻塞的 当一个线程调用 read() 或 write()时,该线程被 阻塞,直到有一些数据被读取,或数据完全写入,该线程在此期间不能再干任何事情了。而 NIO 是非阻塞模式, 若没有数据可用时,该线程可以进行其他任务,单独的线程可以管理多个输入输出通道,大大提高了CPU使用率。

IO是面向流的,NIO是面向缓冲的, 发送给一个通道的所有数据都必须首先放到缓冲区中,同样地,从通道中读取的任何数据都要先读到缓冲区中。也就是说,不会直接对通道进行读写数据,而是要先经过缓冲区。

Selector 选择器

NIO 的选择器允许一个单独的线程来监视多个输入通道,这个线程使用一个选择器 Selector 通过轮询的方式去监听多个通道 Channel 上的事件,从而让一个线程就可以处理多个事件。

Channels

通道 是对原 I/O 包中的流的模拟 ,是一个应用程序和操作系统交互事件,传递内容的渠道。 通道与流(Stream)的不同之处在于,流只能在一个方向上移动 , 而通道是双向的,可以用于读、写或者同时用于读写。 Channel本身不能直接访问数据,Channel只能与Buffer进行交互。

所有被 Selector注册的通道,只能是继承了 SelectableChannel 类的子类。

buffer 缓冲区

缓冲区用于存储数据,一般先向buffer写入数据,buffer会记录写下多少数据,在读取数据之前需要先调用 flip() 从写模式改成读模式。读完了以后需要调用 clear() 清空buffer让他可以重新被写入.

构造方法

ByteBuffer buf = ByteBuffer.allocate(1024);

向buffer写入数据

writeBuffer.put(str)

从Buffer中读取数据

//根据缓冲区可读字节数创建字节数组byte[] bytes = new byte[buffer.remaining()]; //将缓冲区可读字节数组复制到新建的数组中buffer.get(bytes);
byte aByte = buf.get();

get()属于相对读,从 position 位置读取一个 byte,并将 position+1,为下次读写作准备。

byte aByte = buf.get(int index);

属于绝对读,读取 byteBuffer 底层的 bytes 中下标为 index 的 byte,不改 变 position。

Buffer.rewind()将 position 设回 0,所以你可以重读 Buffer 中的所有数据。limit 保持不变, 仍然表示能从 Buffer 中读取多少个元素

SelectionKey

每个Channel 向 Selector 注册时,都将会创建一个 SelectionKey。SelectionKey 将 Channel 与 Selector 建立了 关系,并维护了 channel 事件。

调用cancel 方法取消键,取消的键不会立即从selector中移除,而是添加到 cancelledKeys 中,在下一次 select 操作时移除它.所以在调用某个key 时,需要使用 isValid 进行 校验.

在向 Selector 对象注册事件时, NIO 共定义了四种:OP_READ(读)、OP_WRITE(写)、 OP_CONNECT(请求连接)、OP_ACCEPT(接受连接)

OP_READ: 操作系统的读缓冲区有数据可读时就绪。

OP_WRITE: 操作系统写缓冲区有空闲空间时就绪。一般情况下写缓冲区都有空闲空间,小块数据直接写入即可,没必要注册该操作类型,否则该条件不 断就绪浪费 CPU。

OP_CONNECT: 当 SocketChannel.connect()请求连接成功后就绪。该操作只给客户端 使用。

OP_ACCEPT: 当接收到一个客户端连接请求时就绪。该操作只给服务器使用。

"什么是NIO"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

数据 缓冲 缓冲区 通道 线程 阻塞 事件 多个 模式 操作系统 内容 字节 数组 系统 选择 客户 客户端 情况 方法 是非 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 邹平生产管理软件开发公司 网络安全知识进入社区 保定网络存储服务器厂家 有一台服务器怎么赚钱 软件开发有哪些限制条件 服务器虚拟化开题报告 网络安全相关英文缩写意思 数据库数字型导出结尾是0 数据库适配器有用吗 卡刷谷歌框架服务器 数据库系统概论专升本电子书 长安区节能软件开发服务技术规范 珠海大唐网络技术有限公司 高校知网数据库用量和万方对比 软件开发需要的步骤 网络安全企业财务比较 网络安全团队的职责 网络安全法治教育知识竞赛 想学网络技术加盟排行前十 华为网络技术大赛赛区 游戏设计属于软件开发么 普陀区服务软件开发学习 郑州软件开发app公司有哪些 网络安全的工作目标有什么 手机断断续续连接不上服务器 网络安全思维导图模板 中信软件开发社招英语要求 网络安全手抄报内容画 未落实网络安全处罚下岗 免费领取数据库
0