什么是NIO

发布时间:2021-10-14 10:16:14 作者:iii
来源:亿速云 阅读:217

本篇内容介绍了“什么是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”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

推荐阅读:
  1. Java NIO
  2. 网页主动探测中的NIO优化是怎样的

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

nio

上一篇:基于TCP和多线程的聊天框架代码是什么

下一篇:如何使用swift函数式编程

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》