Java NIO 包介绍
本教程介绍 Java NIO
包。我们已经有了一个用于执行读/写操作的 java.io
包,但是 java.nio
允许我们使用其他特性和功能以不同的方式工作。
如何?让我们深入了解它的细节。
Java NIO
包简介
Java New Input/Output (NIO
) 是一种高性能的文件处理结构和网络 API。java.nio
包包含所有 NIO
类;它不会替换 java.io
包中基于流的输入/输出 (IO
) 类。
Java NIO
是从 JDK 4
版本引入的,作为 java.io
的替代品,具有一些额外的特性和功能,与标准输入/输出 (IO
) 不同的是 IO
)。
我们已经知道 java.io
包具有我们可用于 Java I/O 操作的所有必要类,而 java.nio
引入了可在整个 Java NIO
API 中使用的 buffer
类.
你可能有一个问题:当我们已经有了一个包 java.io
时,为什么要引入一个名为 java.nio
的新包?
使用 Java NIO
包的主要原因
我们更喜欢使用 java.nio
包有两个原因。
java.nio
包使用面向缓冲区的方法,让我们在缓冲区中来回移动。它使用一块内存(也称为缓冲区)来读取和缓存数据,可以在需要时从缓冲区中快速访问;我们也可以将数据写入缓冲区。java.nio
包可以执行非阻塞输入/输出 (IO
) 操作。在这里,非阻塞意味着它可以读取它发现准备好的数据/信息。
例如,我们有一个线程要求通道从缓冲区中读取数据/信息;该线程在该时间范围内进行其他操作,并在离开工作的地方再次继续。同时,完成读取过程,提升整体性能。
NIO
和 IO
之间的主要区别在于 NIO
是非阻塞的,而 IO
是阻塞的。
当我们正在寻找面向缓冲区的方法和高速输入/输出操作时,我们可以优先使用 Java NIO
而不是 IO
包。
NIO
包,你必须了解 Java IO
包。Java NIO
包的主要组件
它具有以下主要组件才能正常工作。
Buffer
- 由于java.nio
包是面向缓冲区的,它具有用于原始数据类型的缓冲区。缓冲区用作容器,我们可以在其中从缓冲区读取数据/向缓冲区读取数据,以便使用通道进行进一步处理。Channel
-java.nio
的频道类类似于用于双向通信的流(IO
流)。通过使用通道,我们可以进行非阻塞的输入/输出操作;我们还可以从通道读取/写入数据到缓冲区。
通道用作网关,其中与各种实体的连接由可以执行非阻塞 IO
操作的通道描述。
Selector
- 我们可以使用选择器来完成非阻塞IO
操作。选择器(一个对象)监视多个通道的事件。
我们可以说选择器选择准备执行输入/输出操作的通道。
在 Java 中使用 NIO
包读取和写入文件
以下是可用于执行不同操作的各种类的图形表示。
你可以在此处详细了解 java.nio
,但我们在本教程中专注于从文件读取和写入与文件相关的操作;请参阅以下示例。
示例代码(用于从文件中读取):
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public class readFromFile {
public static void main(String[] args) {
Path filePath = Paths.get("file.txt");
Charset charSet = Charset.forName("ISO-8859-1");
try {
List<String> lines = Files.readAllLines(filePath, charSet);
for (String line : lines) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println(e);
}
}
}
示例代码(用于写入文件):
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public class writeToFile {
public static void main(String[] args) {
Path filePath = Paths.get("file.txt");
String message = "We have overwritten the file";
Charset charSet = Charset.forName("ISO-8859-1");
try {
Files.write(filePath, message.getBytes());
List<String> lines = Files.readAllLines(filePath, charSet);
for (String line : lines) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println(e);
}
}
}
输出(从文件读取并写入文件):
我们从指定文件中读取数据并在第一个代码片段的命令行中打印出来。在第二个代码示例中,我们将数据(一个小字符串)写入给定文件并将其打印在屏幕上以告知文件中写入的内容。
在第一个示例代码中,我们将 Paths.get()
方法称为 Path
实例的工厂方法。简单来说,我们可以说,每当我们调用 java.nio.file.Paths
类的名为 get()
的静态方法时,它都会创建一个 Path
实例。
此方法采用字符串序列(这些字符串将被连接以形成路径)或字符串作为参数,并将其转换为 Path
实例。如果我们传递的字符串中有任何非法字符,它会抛出 InvalidPathException
。
与 File
一样,java.nio.file.Path
可能指的是文件系统中的相对路径或绝对路径。
Charset
用于字符编码。我们使用 ISO-8859-1
字符编码,但你可以指定 UTF-8
或任何其他你想使用的编码。
readAllLines()
方法逐行读取文本文件。我们将读取的数据保存到 String
的 List
中(参见代码)。
此外,我们使用 for
循环在屏幕上显示所有读取的行。
在第二个代码示例中,除了这行代码之外,所有逻辑都是相同的。
Files.write(filePath, message.getBytes());
File.write()
是 Java NIO
包的静态方法,用于写入指定文件。