Java NIO 包括了下面几个核心组件

  • Channels
  • Buffers
  • Selectors

Java NIO 有很多的类和组件,但核心的是 Channels, BuffersSelectors
其它的组件,像 PipeFileLock,只是跟上面这三个核心组件组合使用的工具类。
因此我们着重介绍这三个核心组件。

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

参考

  1. Java NIO Overview