Java NIO 概述

Java NIO 概述

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

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

  • 通道
  • 缓冲区
  • 选择器

Java NIO 拥有比这些更多的类和组件,但在我看来 ChannelBufferSelector构成了 API 的核心。其余组件,例如 PipeFileLock 仅仅是与三个核心组件结合使用的实用程序类。因此,在本 NIO 概述中,我将重点介绍这三个组件。其他组件在本教程的其他地方以其自己的文本进行了说明。

1 通道(Channel)和缓冲区(Buffer)

通常,NIO 中的所有 IO 都从一个 Channel 开始。Channel有点像流。Channel 中的数据可以读入到一个Buffer。数据也可以从一个Buffer写入到Channel。如下图所示:

Java NIO:通道和缓冲区

Java NIO:通道将数据读取到缓冲区中,缓冲区将数据写入通道中

Java中有几种ChannelBuffer类型。这是ChannelJava NIO中主要实现的列表:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

如您所见,这些通道涵盖 UDP + TCP 网络 IO 和文件 IO。

这些类也有一些有趣的接口,但是为了简单起见,我将它们排除在 Java NIO 概述之外。在本 Java NIO 教程的其他文本中将对它们进行解释。

这是 Java NIO 中 Buffer 的关键的实现:

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

这些 Buffer 包括了您可以通过 IO 发送的基本数据类型:byte, short, int, long, float, double 和 char。

Java NIO 还有与内存映射文件结合使用的 MappedByteBuffer ,不过,不在 Buffer 概述中说明。

2 选择器(Selectors)

Selector 允许单线程处理多个 Channel。如果您的应用程序打开了很多个连接(通道),但每个连接的流量很少,使用 Selector 就会很方便。例如,在聊天服务器中。

这是使用一个 Selector 来处理 3 个 Channel 的示意图:

Java NIO:选择器

要想使用 Selector,需要向 Selector 注册 Channel,然后,调用 select() 方法。该方法会一直阻塞,直到有一个已注册通道有事件准备就绪。方法返回后,线程就会处理这些事件。事件可以是传入连接,接收到的数据等。

posted @ 2020-12-23 14:00  叶杨树  阅读(96)  评论(0)    收藏  举报