Java NIO 包括了下面几个核心组件
- Channels
- Buffers
- Selectors
Java NIO 有很多的类和组件,但核心的是 Channels, Buffers和Selectors。
其它的组件,像 Pipe 和 FileLock,只是跟上面这三个核心组件组合使用的工具类。
因此我们着重介绍这三个核心组件。
Channels and Buffers
通常,所有的IO操作在NIO中都会开始于 Channel。
一个Channel类似于stream,数据从Channel读取到Buffer, 数据也可以从Buffer写入到Channel。
它们的关系就是下面这个图示:

下面是一些主要的Channel实现类,这些Channel覆盖了 UDP + TCP network IO 和 File IO
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
下面是一些主要的Buffer实现类,覆盖了基本数据类型: byte, char, double, float, int, long, short
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffe
Selectors
Selector 可以让一个线程同时处理多个Channel。适用于我业务系统同时有多个低流量的连接,比如即时通讯。
下面是一个Selector处理多个Channel的示例图:

要使用Selector,你需要注册Channel到Selector,然后调用Selector的select()方法。
这个方法会一直阻塞直到监听到有Channel注册事件。只要这个方法正常返回了,线程就可以处理这些事件,比如建立了连接、收到了客户端发送的数据等等。