Java NIO 包介绍

Mehvish Ashiq 2024年2月15日
  1. Java NIO 包简介
  2. 在 Java 中使用 NIO 包读取和写入文件
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 包有两个原因。

  1. java.nio 包使用面向缓冲区的方法,让我们在缓冲区中来回移动。它使用一块内存(也称为缓冲区)来读取和缓存数据,可以在需要时从缓冲区中快速访问;我们也可以将数据写入缓冲区。
  2. java.nio 包可以执行非阻塞输入/输出 (IO) 操作。在这里,非阻塞意味着它可以读取它发现准备好的数据/信息。

例如,我们有一个线程要求通道从缓冲区中读取数据/信息;该线程在该时间范围内进行其他操作,并在离开工作的地方再次继续。同时,完成读取过程,提升整体性能。

NIOIO 之间的主要区别在于 NIO 是非阻塞的,而 IO 是阻塞的。

当我们正在寻找面向缓冲区的方法和高速输入/输出操作时,我们可以优先使用 Java NIO 而不是 IO 包。

注意
要完美使用 Java NIO 包,你必须了解 Java IO

Java NIO 包的主要组件

它具有以下主要组件才能正常工作。

  1. Buffer - 由于 java.nio 包是面向缓冲区的,它具有用于原始数据类型的缓冲区。缓冲区用作容器,我们可以在其中从缓冲区读取数据/向缓冲区读取数据,以便使用通道进行进一步处理。
  2. Channel - java.nio 的频道类类似于用于双向通信的流(IO 流)。通过使用通道,我们可以进行非阻塞的输入/输出操作;我们还可以从通道读取/写入数据到缓冲区。

通道用作网关,其中与各种实体的连接由可以执行非阻塞 IO 操作的通道描述。

  1. Selector - 我们可以使用选择器来完成非阻塞 IO 操作。选择器(一个对象)监视多个通道的事件。

我们可以说选择器选择准备执行输入/输出操作的通道。

在 Java 中使用 NIO 包读取和写入文件

以下是可用于执行不同操作的各种类的图形表示。

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);
    }
  }
}

输出(从文件读取并写入文件):

java nio 包介绍-输出

我们从指定文件中读取数据并在第一个代码片段的命令行中打印出来。在第二个代码示例中,我们将数据(一个小字符串)写入给定文件并将其打印在屏幕上以告知文件中写入的内容。

在第一个示例代码中,我们将 Paths.get() 方法称为 Path 实例的工厂方法。简单来说,我们可以说,每当我们调用 java.nio.file.Paths 类的名为 get() 的静态方法时,它都会创建一个 Path 实例。

此方法采用字符串序列(这些字符串将被连接以形成路径)或字符串作为参数,并将其转换为 Path 实例。如果我们传递的字符串中有任何非法字符,它会抛出 InvalidPathException

File 一样,java.nio.file.Path 可能指的是文件系统中的相对路径或绝对路径。

Charset 用于字符编码。我们使用 ISO-8859-1 字符编码,但你可以指定 UTF-8 或任何其他你想使用的编码。

readAllLines() 方法逐行读取文本文件。我们将读取的数据保存到 StringList 中(参见代码)。

此外,我们使用 for 循环在屏幕上显示所有读取的行。

在第二个代码示例中,除了这行代码之外,所有逻辑都是相同的。

Files.write(filePath, message.getBytes());

File.write() 是 Java NIO 包的静态方法,用于写入指定文件。

作者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook