Java NIO(New I/O)是 Java 1.4 引入的一组新的 I/O 操作类库,提供了更高效的 I/O 操作方式,适用于处理大量并发连接或大文件的场景。NIO 与传统的 I/O (即 BIO, Blocking I/O) 有着显著的不同,主要特点如下:
1. 非阻塞 I/O(Non-blocking I/O)
传统的 I/O 操作是阻塞的,即一个线程在进行 I/O 操作时会一直等待,直到操作完成。而 NIO 提供了非阻塞的 I/O 操作,允许线程在等待 I/O 操作完成期间可以继续执行其他任务。
例如,NIO 的 SocketChannel
可以配置为非阻塞模式,一个线程可以在等待网络数据时继续做其他事情,而不会被阻塞住。
2. 选择器(Selector)
NIO 引入了 Selector
,它允许一个线程管理多个通道(Channel)的 I/O 操作。通过 Selector
,可以检测到哪些通道已经准备好进行读、写等操作,然后只对这些通道进行操作。这大大提高了多路复用的效率,特别是在处理大量并发连接时,通常用于构建高性能的服务器。
3. 通道(Channel)
NIO 引入了 Channel
概念,类似于流(Stream),但比流更强大。通道是双向的,可以进行读和写操作,而传统的 I/O 流是单向的。常见的通道有:
FileChannel
:用于文件的数据读写。SocketChannel
:用于 TCP 网络连接的读写。DatagramChannel
:用于 UDP 网络连接的读写。ServerSocketChannel
:用于监听 TCP 连接的通道。
4. 缓冲区(Buffer)
NIO 中的数据读写都是通过缓冲区(Buffer)进行的。缓冲区是一个容器,用于存储从通道中读取的数据或者将要写入通道的数据。每种基本数据类型(如 ByteBuffer
, CharBuffer
等)都有对应的缓冲区类。
缓冲区有三个关键属性:
- 位置(position):指示下一个要读或写的位置。
- 限制(limit):表示缓冲区的第一个不能被读或写的元素。
- 容量(capacity):表示缓冲区的最大存储容量,无法超过这个容量。
5. 文件锁定(File Locking)
NIO 支持文件锁定(File Locking),允许你对文件的部分或全部进行锁定,从而控制对文件的并发访问。这对于需要对文件进行多线程并发读写的应用程序非常有用。
6. 内存映射文件(Memory-Mapped File)
NIO 支持内存映射文件(Memory-Mapped File),即将文件的一部分或全部直接映射到内存中,这样可以像访问内存一样访问文件。这种方式非常适合处理大文件,特别是在随机访问文件内容时,性能优势显著。
7. 字符集编码和解码(Charset)
NIO 提供了 Charset
类来处理字符集编码和解码,可以轻松将字节数组转换为字符串或将字符串转换为字节数组,支持多种字符集。
总结
Java NIO 提供了更灵活和高效的 I/O 操作,适合于构建高性能的网络应用和处理大量数据的场景。通过非阻塞 I/O、选择器、通道和缓冲区等机制,NIO 提高了资源的利用率和程序的响应能力。