原文连接 Java NIO Overview
Java NIO 包含了一下核心组件。
-
Channels
-
Buffers
-
Selectors
Java NIO 中的类和组件远远多于这三个,在我看来 Channel
, Buffer
和 Selector
构成了 API 的核心,其余组件像 Pipe
和 FileLock
只不过是为了配合三个核心组件而结合使用的类罢了。因此,在本节概述中我会重点讲解这个三个核心组件。其他组件会在本教程中各自章节分别介绍。
通道和缓冲区(Channels and Buffers)
通常来讲,在 NIO 中所有的 IO 操作都开始于 Channel
,Channel
就像字节流一样,数据可以从 Channel
读取,然后写到 Buffer
中。也可以从 Buffer
中读取写入到 Channel
中 。

Channel
和 Buffer
有比较多的类型。下面列举了在主要的几种 Channel
。
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
如你所见,这些 Channel
覆盖了 UDP + TCP 网络 IO ,以及文件 IO。
伴随着这些 Channel
还会有一些其他的比较有趣的接口,简单起见,本章节暂不做介绍,我会在本系列教程的相关地方引入这些接口。
下面是 NIO 中核心 Buffer
实现类的列表。
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
这些 Buffer
涵盖了可以通过 IO 发送的基础数据类型:byte, short, int, long, float, double and characters。
NIO 还有一个用于和内存映射文件一起使用的 MappedByteBuffer
,同样本章节先不做介绍。
选择器(Selectors)
选择器允许单个的线程操作多个 Channel
,如果你的应用是那种要打开很多连接但是每个连接的数据传输量又比较低,这个特性是相当便利的。例如聊天服务器。
下面是一个线程操作三个 Channel
的示意图。

使用 selector
之前你必须先把 Channel
注册到 selector
上,之后你就可以调用它的 select()
方法,该方法是阻塞的,直到有一个 Channel
的状态符合条件,方法返回后线程就可以处理接下来的流程。事件的示例有传入连接,接受数据等等。
译者注:如果你是第一次了解 NIO 的话,你可能会对这里有些疑问。实际上是这个样子的,
Channel
注册到selector
上时会指定一个特定事件,选择器会监听该Channel
上的特定事件,当特定事件满足时,select()
方法就会返回。