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主要有以下两个原因:
- 非阻塞 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 包列表以及使用它们的原因:
Package | Purpose |
---|---|
java.nio package | It 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 package | It 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 package | It supports the service provider classes for java.io.channel package. |
java.nio.file package | It provides the support for files. |
java.nio.file.spi package | It supports the service provider classes for java.io.file package. |
java.nio.file.attribute package | It provides the support for file attributes. |
java.nio.charset package | It defines character sets and providing encoding and decoding operations for new algorithms. |
java.nio.charset.spi package | It 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。以下是旧包中缺少的一些内容以及使用新包的原因:
- 旧模块为符号链接提供有限的支持。
- 旧模块对文件属性和性能问题提供有限的支持。
- 旧模块无法在所有平台上始终如一地工作。
- 旧模块缺少文件复制、移动等基本操作。
参考这篇文章了解Java-IO和Java-NIO的区别