Java IO(输入/输出)用于执行读取和写入操作。java.io 包包含了输入和输出操作所需的所有类。相比之下,Java NIO(New IO,即新 IO)是从 JDK 4 开始引入的,旨在实现高速 IO 操作。它是标准 IO API 的一种替代方案。
在本文中,我们将深入探讨 Java NIO 的相关概念。
Java NIO(New Input/Output,即新输入/输出) 是一种高性能的网络和文件处理 API 及架构,它作为 Java 的替代 IO API 存在。它从 JDK 4 开始引入。Java NIO 作为继标准 Java IO 之后的第二个 I/O 系统,增加了一些高级功能。它提供了一种与标准 IO 不同的处理 I/O 的方式。就像包含所有 Java 输入输出操作所需类的 Java.io 包一样,java.nio 包 定义了在整个 NIO API 中使用的缓冲区类。我们使用 Java NIO 主要出于以下两个原因:
- 非阻塞 IO 操作: Java NIO 执行非阻塞 IO 操作。这意味着它会读取已准备好的数据。例如,一个线程可以请求通道从缓冲区读取数据,在此期间该线程可以去处理其他工作,然后再从之前离开的地方继续执行。同时,读取操作已完成,这提高了整体效率。
- 面向缓冲区的方法: Java NIO 的面向缓冲区方法允许我们在需要时在缓冲区中前后移动。数据被读入缓冲区并缓存在那里。每当需要数据时,会从缓冲区中进一步处理。
Java NIO 包的主要工作基于一些核心组件。它们是:
- 缓冲区: 该包为原始数据类型提供了缓冲区。Java NIO 是一个面向缓冲区的包。这意味着数据可以写入/读取到缓冲区,然后通过通道进行处理。在这里,缓冲区充当数据的容器,因为它持有原始数据类型并提供了其他 NIO 包的概览。这些缓冲区可以被填充、排空、翻转、倒回等。
- 通道: 通道是新的原始 I/O 抽象。通道有点像用于与外部世界通信的流。我们可以从通道将数据读入缓冲区,或者从缓冲区写入数据。Java NIO 执行非阻塞 IO 操作,而通道正是用于这些 IO 操作。与不同实体的连接由各种通道表示,这些通道能够执行非阻塞 I/O 操作。通道充当一种媒介或网关。下图说明了通道和缓冲区的交互:
- 选择器: 选择器用于非阻塞 I/O 操作。选择器是一个监控多个通道事件的对象。由于 Java NIO 执行非阻塞 IO 操作,选择器与可选择通道的选择键共同定义了多路复用 IO 操作。因此,简单来说,我们可以说选择器用于选择那些已准备好进行 I/O 操作的通道。下图说明了选择器如何处理通道:
Java NIO 提供了一种基于通道、缓冲区和选择器的新 I/O 模型。因此,这些模块被视为 API 的核心。下表列出了 NIO 系统的 Java.nio 包及其用途:
用途
—
它提供了其他 NIO 包的概览。该 NIO 系统封装了不同类型的缓冲区,这些缓冲区在整个 NIO API 中都有使用。
它支持通道和选择器,它们代表与实体的连接,本质上是打开 I/O 连接并选择准备好进行 I/O 的通道。
它支持 java.nio.channel 包的服务提供者类。
它提供对文件的支持。
它支持 java.nio.file 包的服务提供者类。
它提供对文件属性的支持。
它定义字符集并为新算法提供编码和解码操作。
它支持字符集的服务提供者类。