NIO(New I/O或者Non-blocking I/O)是从Java 1.4开始引入的一种新的I/O编程方式,相对于传统的IO来说,NIO更加灵活、高效、可靠,能够更好地处理海量数据和高并发场景。简单来说就是:并发能力强。

1. 三大组件

1.1 Channel

Untitled

Channel是数据传输的双向通道,Stream要不就是读,要不就是写。Channel比Stream更加底层。

常见的Channel有FileChannel、SocketChannel。

1.2 Buffer

Buffer是用来缓冲读写数据的。

常见的Buffer有ByteBuffer、IntBuffer

1.3 Selector

以前的多线程服务器程序,一个线程对应一个Socket,只能适合连接数少的场景。而线程池版,阻塞模式下,只能处理一个Socket链接。

Untitled

Untitled

selector 的作用就是配合一个线程来管理多个 channel。适合连接数特别多,但流量低的场景。

Untitled

调用 selector 的 select() 会阻塞直到 channel 发生了读写就绪事件,这些事件发生,select 方法就会返回这些事件交给 thread 来处理。

2 ByteBuffer详解

(1) 正确使用方法