Java NIO包含以下核心组件:
- Channels
- Buffers
- Selectors
Java NIO有比这些更多的类和组件,但在我看来,Channel,Buffer和Selector构成了API的核心。 其余的组件,如Pipe和FileLock,只是与三个核心组件一起使用的实用程序类。 因此,我将在本NIO概述中关注这三个组件。 其他组件在本教程其他地方的自己的文本中进行了解释。 请参阅本页顶部的菜单。
Channels and Buffers
通常,NIO中的所有IO都以Channel开头。 通道有点像流。 从Channel数据可以读入Buffer。 数据也可以从Buffer写入Channel。 这是一个例子:
| | | Java NIO: Channels read data into Buffers, and Buffers write data into Channels |
有几种Channel和Buffer类型。 以下是Java NIO中主要Channel实现的列表:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
如您所见,这些通道涵盖UDP + TCP网络IO和文件IO。
这些类也有一些有趣的接口,但为了简单起见,我会将它们排除在Java NIO概述之外。 在Java NIO教程的其他文本中,将相关地解释它们。
以下是Java NIO中核心Buffer实现的列表:
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
这些缓冲区涵盖了可以通过IO发送的基本数据类型:byte,short,int,long,float,double和characters。
Java NIO还有一个MappedByteBuffer,它与内存映射文件一起使用。 我将把这个缓冲区从这个概述中删除。
Selectors
选择器允许单个线程处理多个通道。 如果您的应用程序打开了许多连接(通道),但每个连接只有较低的流量,这很方便。 例如,在聊天服务器中。
以下是使用Selector处理3个Channel的线程图示:
| | | Java NIO: A Thread uses a Selector to handle 3 Channel's |
要使用选择器,请使用它注册通道。 然后你调用它的select()方法。 此方法将阻塞,直到有一个已注册通道的事件准备就绪。 一旦该方法返回,该线程就可以处理这些事件。 事件的示例是传入连接,接收数据等。