你好,NIO!

96 阅读2分钟

这是我参与更文挑战的第2天,活动详情查看: 更文挑战

什么是NIO?

英文java non-blocking IO,指JDK提供的新API,JDK1.4后提供的改进输入输出的新特性,相关类在java.nio下,对原IO包中的很多类进行了改写,是同步非阻塞的。

NIO的3大核心?

Buffer缓冲区:本质是一块可以写入数据,可以从中读取数据的内存。这块内存被包装成Buffer对象,并提供一组方法,用来方便的访问该块内存,底层是一个数据。

Channel通道: 类似流,流是单向的。通道呢?我们可以从通道中读取数据,又可以写数据到通道。

Selector选择器:是NIO的一个组件,能够检查多个NIO通道,并确定哪些通道已经做好准备进行读取或写入。

三者之间的关系为:

image.png

上图总结:

1)每个channel都会对应一个Buffer,进行数据读写;

2)一个Selector对应对个channel,Selector会根据不同的时间,在各个通道上切换;

IO模型?

为了更好的理解网络编程IO模型,这里回顾上次内容进行对比:

1.BIO:同步阻塞,服务器实现模式为一个连接一个线程,会造成不必要的线程开销;

2.NIO:同步非阻塞,服务器实现模式是一个线程处理多个请求连接,即客户端发送的连接请求都会注册到多路复用器上,多路轮询到连接有IO请求就进行处理。

3.BIO以字节流进而字符流的方式处理数据,而NIO基于Channel和Buffer进行操作,数据总是从通道读取到缓冲区,或者从缓冲区写入到甬道中,Selector用于监听多个甬道的事件,使单个线程可以监听多个客户端甬道。

4 BIO适用于连接数小且固定的架构,NIO适用于连接数目多且连接比较短的架构,比如聊天服务器,弹幕,服务器通讯等。

遗留问题:

1)什么是多路复用器?

2)一个线程最多能处理多少个连接请求?

3)Selector、channel和Buffer具体如何操作?