什么是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”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
当前标题:什么是NIO
文章源于:http://myzitong.com/article/jecehg.html