NIO提供了一个全新的底层的I/O层模型。与最初的java.io包中面向留(Stream-oriented)的概念不同,NIO采用了面向块的概念(block-oriented)。这意味着尽可能的情况下,I/O操作以大的数据块为单位进行,而不是一次一个字节或字符进行
NIO中提供了与平台无光的非阻塞I/O(nonblocking I/O)。与面向线程的、阻塞式I/O方式相比,多道通信、非阻塞I/O技术可以使应用程序更有效地处理大量连接的情况
IO的阻塞操作
在传统I/O操作中接收键盘数据的操作时只要执行到readLine()方法,程序就要停止等待用户输入数据;在网络编程中服务器端使用ServerSocket类的accept()方法时,服务器一直处于等待操作,要等待客户端连接。这两类都属于阻塞操作,因为都会让程序暂停执行
在基本IO操作中所有操作都是直接已流的形式完成的,而在NIO中所有的操作都要使用缓存区处理,且所有的读写操作都是通过缓存区完成的。缓存区(Buffer)是一个线性的、有序的数据集,只能容纳某种特定的数据类型
通道 Channel
通道可以用来读取和写入数据,通道类似之前的输入/输出流,但是程序不会直接操作通道,所有的内容都是先读到或写入缓冲区中,在通过缓冲区中取得或写入
通道与传统的流操作不同,传统的流操作分为输入或输出流,而通道本身是双向操作的,既可以完成输入也可以完成输出
图: 通道的操作流程
Selector
在新IO中Selector是一个极其重要的概念,在原来使用IO和Socket构造网络服务时,所有的网络服务将使用阻塞的方式进行客户端的连接,而如果使用了新IO则可以构造一个非阻塞的网络服务