NIO

Java NIO 概览

Posted by Forgus on 2019-03-10

Java NIO 由以下核心组件构成:

  • 通道
  • 缓冲区
  • 选择器

Java NIO 框架包含了很多类和组件,但是Channel,Buffer 和 Selector 是核心。其他的组件,像 Pipe 和 FileLock 只不过是结合了那三个组件作为工具类来使用。所以,在这篇概览里我会着重介绍这三个组件。

通道和缓冲区

一般地,NIO框架里所有的IO操作都始于一个通道。一个通道有点像一个流。数据可以从通道读入缓冲区,也可以从缓冲区写入通道。如图:

通道和缓冲区有很多种。以下是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和字符。

Java NIO还包含了一个MappedByteBuffer,用于表示内存映射文件。

选择器

选择器允许单线程处理多个通道。如果你的应用需要维护很多打开的连接(通道),但是每个连接只有少量的流量,这会使你受益。例如,在一个聊天服务器里。

以下是一个单线程通过一个选择器处理3个通道的示意图 :

要使用选择器,得向它注册通道。然后调用它的select()方法。这个方法会阻塞直到有某个注册通道有事件就绪。一旦这个方法返回,线程就可以开始处理这些事件。事件包括即将到来的连接,数据已收到等。


原文链接 作者:Jakob Jenkov