📜  Java NIO 简介与示例

📅  最后修改于: 2022-05-13 01:54:19.289000             🧑  作者: Mango

Java NIO 简介与示例

Java IO (输入/输出)用于执行读写操作。 Java.io 包包含输入和输出操作所需的所有类。而Java NIO(New IO)是从 JDK 4 引入的,用于实现高速 IO 操作。它是标准 IO API 的替代方案。

在本文中,我们将更多地了解Java NIO。

Java NIO(新输入/输出)是高性能网络和文件处理 API 和结构,可作为Java的替代 IO API。它是从 JDK 4 引入的Java NIO 作为标准Java IO 之后的第二个 I/O 系统,具有一些附加的高级功能。它提供了一种与标准 IO 不同的 I/O 工作方式。与包含Java输入和输出操作所需的所有类的Java .io包一样, Java.nio 包定义了在整个 NIO API 中使用的缓冲区类。我们使用Java NIO主要有以下两个原因:

  1. 非阻塞 IO 操作: Java NIO 执行非阻塞 IO 操作。这意味着它读取准备好的数据。例如,一个线程可以请求一个通道从缓冲区读取数据,并且该线程可以在此期间进行其他工作,并从它离开的前一个点再次继续。同时,读取操作完成,提高了整体效率。
  2. 面向缓冲区的方法: Java NIO 的面向缓冲区的方法允许我们根据需要在缓冲区中来回移动。数据被读入缓冲区并缓存在那里。每当需要数据时,都会从缓冲区中对其进行进一步处理。

Java NIO 包的主要工作是基于一些核心组件。他们是:

  1. 缓冲区:此包中的缓冲区可用于原始数据类型。 Java NIO 是一个面向缓冲区的包。这意味着可以将数据写入/读取到缓冲区,该缓冲区使用通道进一步处理。在这里,缓冲区充当数据的容器,因为它保存原始数据类型并提供其他 NIO 包的概述。这些缓冲区可以被填充、排空、翻转、倒带等。
  2. 通道:通道是新的原始 I/O 抽象。通道有点像用于与外界通信的流。从通道中,我们可以将数据读入缓冲区或从缓冲区写入。 Java NIO 执行非阻塞 IO 操作,并且通道可用于这些 IO 操作。与不同实体的连接由能够执行非阻塞 I/O 操作的各种通道表示。通道充当媒介或网关。下图说明了通道和缓冲区的交互:

  3. 选择器:选择器可用于非阻塞 I/O 操作。选择器是一个监控多个通道的事件的对象。由于Java NIO 执行非阻塞 IO 操作,选择器和具有可选通道的选择键定义了多路复用 IO 操作。因此,简单来说,我们可以说选择器用于选择准备好进行 I/O 操作的通道。下图说明了处理通道的选择器:

Java NIO 提供了一种基于通道、缓冲区和选择器的新 I/O 模型。因此,这些模块被认为是 API 的核心。下表说明了 NIO 系统的Java .nio 包列表以及使用它们的原因:

PackagePurpose
java.nio packageIt provides the overview of the other NIO packages.Different types of buffers are encapsulated by this NIO system, which are used throughout the NIO API’s.
java.nio.channels packageIt supports channels and selectors, which represent connections to entities which are essentially open the I/O connections and selects the channel ready for I/O.
java.nio.channels.spi packageIt supports the service provider classes for java.io.channel package.
java.nio.file packageIt provides the support for files.
java.nio.file.spi packageIt supports the service provider classes for java.io.file package.
java.nio.file.attribute packageIt provides the support for file attributes.
java.nio.charset packageIt defines character sets and providing encoding and decoding operations for new algorithms.
java.nio.charset.spi packageIt supports the service provider classes for java.nio.charset package.

当Java .io.File 已经存在时,为什么选择Java .nio.File?一个非常常见的问题是,当Java .io.File 已经存在时,为什么我们要迁移到Java .nio.File。旧的Java.io.File 中缺少一些东西,导致使用新的Java.nio.File。以下是旧包中缺少的一些内容以及使用新包的原因:

  1. 旧模块为符号链接提供有限的支持。
  2. 旧模块对文件属性和性能问题提供有限的支持。
  3. 旧模块无法在所有平台上始终如一地工作。
  4. 旧模块缺少文件复制、移动等基本操作。

参考这篇文章了解Java-IO和Java-NIO的区别