Skip to content

NIO入门

1. NIO的组成

Java NIO由以下三个核心部分组成:

  • Channels
  • Buffers
  • Selectors
    虽然Java NIO中除此之外还有很多类和组件,但Channel,Buffer和Selector构成了核心的API。其它组件如Pipe和FileLock,只不过是与三个核心组件共同使用的工具类。

1.1 Channel

Channel可以翻译成"通道"。Channel和IO中的Stream(流)是差不多一个等级的。只不过Stream是单向的,譬如:InputStream, OutputStream.而Channel是双向的,既可以用来进行读操作,又可以用来进行写操作。NIO中的Channel的主要实现有:FileChannel、DatagramChannel、SocketChannel和ServerSocketChannel,这里看名字就可以猜出个所以然来:分别可以对应文件IO、UDP和TCP(Server和Client)

1.2 Buffer

NIO中的关键Buffer实现有:ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer,分别对应基本数据类型: byte, char, double, float, int, long, short。

1.3 Selector

Selector运行单线程处理多个Channel,如果你的应用打开了多个通道,但每个连接的流量都很低,使用Selector就会很方便。例如在一个聊天服务器中。要使用Selector, 得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新的连接进来、数据接收等。

1.4 三者关系

  1. 一个Channel就像一个流,只是Channel是双向的,Channel读数据到Buffer,Buffer写数据到Channel。
    Alt text
  2. 一个Selector允许一个线程处理多个Channel。
    Alt text

2. NIO处理过程

关键就是轮询器(Selector)的使⽤。轮询器(Selector)负责监视全部通道IO的状态,当其中任意⼀个或者多个通道具有可⽤的IO操作时,该轮询器(Selector)会通过⼀个⽅法返回⼤于0的整数,该整数值就表⽰具体有多少个通道上具有可⽤的IO操作。服务器正是通过该轮询器(Selector)来完成单事件轮询机制,并实现了多路复⽤功能。