Java NIO 包括以下核心组件:
- Channels
- Buffers
- Selectors
Java NIO 中除了上面这些,还有很多类和组件,但是在我看来, Channel ,Buffer 和 Selector 形成了 API 的核心。其他组件(如 Pipe 和 FileLock)仅仅是与三个核心组件结合使用的实用工具类。因此,我将在本文中关注这三个组件。
通道(Channel)和缓冲区(Buffers)
通常,NIO 中的所有 IO 都以通道(Channel)开始。一个通道有点像流。 数据可以从通道读入缓冲区。数据也可以从缓冲区写入通道。这里有一个例子:
有多种通道和缓冲区类型。以下是Java NIO 中通道 Channel 实现的列表:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
如你所见,这些通道包括UDP + TCP 网络 IO 和文件 IO。
还有一些有趣的接口混合在这些类中,但为了简单起见,会在本文中避开它们。
下面是 Java NIO 中的缓冲区 Buffer 实现的列表:
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
这些 Buffer 包含了你可以通过 IO 发送的基本数据类型:byte,short,int,long,float,double 和 characters。
Java NIO 还有一个 MappedByteBuffer 的 Buffer,它与内存映射文件结合使用。此处不做详述。
选择器(Selectors)
一个选择器允许单个线程处理多个通道。如果你的应用程序有许多打开的连接(通道),但每个连接上的流量都很低,这情况下用选择器会很方便。例如:聊天服务器。
这里是一个线程使用选择器来处理3通道的插图:
请在选择器上注册通道后使用它。然后你调用它的 select() 方法。此方法将阻塞到有一个事件到达先前注册好的某个通道。一旦方法返回,线程就可以处理这些事件。事件的案例可以是新进入的连接或接收数据等。