Java NIO 概述

Java NIO 包括以下核心组件:

  • Channels
  • Buffers
  • Selectors

Java NIO 中除了上面这些,还有很多类和组件,但是在我看来, Channel BufferSelector 形成了 API 的核心。其他组件(如 Pipe 和 FileLock)仅仅是与三个核心组件结合使用的实用工具类。因此,我将在本文中关注这三个组件。

通道(Channel)和缓冲区(Buffers)

通常,NIO 中的所有 IO 都以通道(Channel)开始。一个通道有点像流。 数据可以从通道读入缓冲区。数据也可以从缓冲区写入通道。这里有一个例子:

Java NIO 概述_第1张图片
**Java NIO: 通道将数据读入缓冲区,缓冲区将数据写入通道**

有多种通道和缓冲区类型。以下是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 和 characters。

Java NIO 还有一个 MappedByteBuffer 的 Buffer,它与内存映射文件结合使用。此处不做详述。

选择器(Selectors)

一个选择器允许单个线程处理多个通道。如果你的应用程序有许多打开的连接(通道),但每个连接上的流量都很低,这情况下用选择器会很方便。例如:聊天服务器。

这里是一个线程使用选择器来处理3通道的插图:

Java NIO 概述_第2张图片
**Java NIO: 一个线程使用一个选择器来处理3个通道**

请在选择器上注册通道后使用它。然后你调用它的 select() 方法。此方法将阻塞到有一个事件到达先前注册好的某个通道。一旦方法返回,线程就可以处理这些事件。事件的案例可以是新进入的连接或接收数据等。

原文链接:http://tutorials.jenkov.com/java-nio/overview.html

你可能感兴趣的:(Java NIO 概述)