NIO
在介绍NIO 编程之前, 我们首先需要澄清一个概念: NIO 到底是什么的简称? 有人称之为New I/O , 原因在于它相对于之前的 I/O 类库是新增的。这是它的官方叫法。但是,由于之前老的I/O 类库是阻塞 I/O , New I/O 类库的目标就是要让Java 支持非阻塞I/O , 所以, 更多的人喜欢称之为非阻塞I/O ( Non-block I/O ) 。由于非阻塞I/O 更能够体现NIO 的特点, 所以我们之后也将 NIO 指非阻塞 I/O 。
Java NIO 是从Java 1.4版本开始引入的,可以替代标准的Java IO API。它在标准Java 代码中提供了高速的、面向块的I/O 通过定义包含数据的类, 以及通过以块的形式处理这些数据, NIO 不用使用本机代码就可以利用低级优化, 这是原来的I/O包所无法做到的。
NIO与普通IO的主要区别
IO | NIO |
---|---|
面向流(Stream Oriented) | 面向缓冲区(Buffer Oriented) |
阻塞IO(Blocking IO) | 非阻塞IO(Non Blocking IO) |
(无) | 选择器(Selectors) |
- Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。
- Asynchronous IO(异步IO):Java NIO可以让你异步的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。
- Selectors(选择器):Java NIO引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。