【译】Java NIO 简明教程系列之 NIO 概述

713 阅读2分钟

原文连接 Java NIO Overview

Java NIO 包含了一下核心组件。

  • Channels

  • Buffers

  • Selectors

Java NIO 中的类和组件远远多于这三个,在我看来 Channel, BufferSelector 构成了 API 的核心,其余组件像 PipeFileLock 只不过是为了配合三个核心组件而结合使用的类罢了。因此,在本节概述中我会重点讲解这个三个核心组件。其他组件会在本教程中各自章节分别介绍。

通道和缓冲区(Channels and Buffers)

通常来讲,在 NIO 中所有的 IO 操作都开始于 ChannelChannel 就像字节流一样,数据可以从 Channel 读取,然后写到 Buffer 中。也可以从 Buffer 中读取写入到 Channel 中 。

Java NIO: Channels read data into Buffers, and Buffers write data into Channels

ChannelBuffer 有比较多的类型。下面列举了在主要的几种 Channel

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

如你所见,这些 Channel 覆盖了 UDP + TCP 网络 IO ,以及文件 IO。

伴随着这些 Channel 还会有一些其他的比较有趣的接口,简单起见,本章节暂不做介绍,我会在本系列教程的相关地方引入这些接口。

下面是 NIO 中核心 Buffer 实现类的列表。

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

这些 Buffer 涵盖了可以通过 IO 发送的基础数据类型:byte, short, int, long, float, double and characters。

NIO 还有一个用于和内存映射文件一起使用的 MappedByteBuffer,同样本章节先不做介绍。

选择器(Selectors)

选择器允许单个的线程操作多个 Channel,如果你的应用是那种要打开很多连接但是每个连接的数据传输量又比较低,这个特性是相当便利的。例如聊天服务器。

下面是一个线程操作三个 Channel 的示意图。

Java NIO: A Thread uses a Selector to handle 3 Channel's

使用 selector 之前你必须先把 Channel 注册到 selector 上,之后你就可以调用它的 select() 方法,该方法是阻塞的,直到有一个 Channel 的状态符合条件,方法返回后线程就可以处理接下来的流程。事件的示例有传入连接,接受数据等等。

译者注:如果你是第一次了解 NIO 的话,你可能会对这里有些疑问。实际上是这个样子的,Channel 注册到 selector 上时会指定一个特定事件,选择器会监听该 Channel 上的特定事件,当特定事件满足时,select() 方法就会返回。