Java NIO 入门指南与实践示例

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 操作。通道充当一种媒介或网关。下图说明了通道和缓冲区的交互:

<img src="https://media.geeksforgeeks.org/wp-content/uploads/20200528205425/channel-2.png" alt="image" />

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

<img src="https://media.geeksforgeeks.org/wp-content/uploads/20200528205706/selector-2.png" alt="image" />

Java NIO 提供了一种基于通道、缓冲区和选择器的新 I/O 模型。因此,这些模块被视为 API 的核心。下表列出了 NIO 系统的 Java.nio 包及其用途:

用途

java.nio 包

它提供了其他 NIO 包的概览。该 NIO 系统封装了不同类型的缓冲区,这些缓冲区在整个 NIO API 中都有使用。

java.nio.channels 包

它支持通道和选择器,它们代表与实体的连接,本质上是打开 I/O 连接并选择准备好进行 I/O 的通道。

java.nio.channels.spi 包

它支持 java.nio.channel 包的服务提供者类。

java.nio.file 包

它提供对文件的支持。

java.nio.file.spi 包

它支持 java.nio.file 包的服务提供者类。

java.nio.file.attribute 包

它提供对文件属性的支持。

java.nio.charset 包

它定义字符集并为新算法提供编码和解码操作。

java.nio.charset.spi 包

它支持字符集的服务提供者类。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/43386.html
点赞
0.00 平均评分 (0% 分数) - 0