Java NIO包含了如下几个核心组件:
- Channels
- Buffers
- Selectors
Java NIO 有比这多得多的类和组件,但是依我看来,这三种是这套API的核心架构。其它的组件,例如Pipe,FileLock等,仅仅是用来联系这三个核心组件的工具类而已。因此,我将主要介绍这三个核心组件。
Channels 和 Buffers
一般来说,所有的NIO都是以Channel起手。Channel有点像是一个流。通过Channel数据可以被读入到buffer中。数据也可以通过buffer写入到一个channel。下面用图说明:
有许多Channel、Buffer的实现。下面列出了一些比较重要的:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
正如你所见,这些channels覆盖了UDP + TCP 的网络IO和文件IO。
下面是Buffer接口的核心实现:
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
这些Buffer覆盖了Java基本类型数据(除了Boolean),Java NIO还有一个叫做MappedByteBuffer的类,用来把内存数据和文件映射起来。这个Buffer在后续章节里说明。
Selectors
选择器允许一个线程控制多个Channel。当你的应用有许多连接,但单个channel流量很少时很有用。例如,一个聊天工具。
下图表示的是一个selector管理三个channel:
把selector注册channel中。当你调用Selector的 select()方法时,方法会阻塞,直到所有注册了的channel中有一个事件触发了才会返回。一旦方法返回,线程就可以继续处理这些事件。例如,连接成功的事件、接收到数据的事件等。