Java I/O 教程

6 Dec 2024 | 6 分钟阅读

Java I/O (输入和输出) 用于处理输入并产生输出。

Java 使用流的概念来快速进行 I/O 操作。java.io 包包含输入和输出操作所需的所有类。

我们可以通过 Java I/O API 在 Java 中执行文件处理

Java I/O 的核心概念

Java I/O 主要围绕两个核心概念:读取器/写入器

流: 流代表一系列数据。在 Java 中,有两种类型的流:输入流和输出流。输入流用于从源读取数据,而输出流用于向目标写入数据。流可以分为字节流(InputStream 和 OutputStream)和字符流(Reader 和 Writer)。

读取器/写入器: 读取器和写入器是专门用于处理字符数据的流类。它们提供了一种方便的方式来从基于字符的数据源读取和写入数据。读取器从输入流读取字符数据,而写入器将字符数据写入输出流。

Stream

流是一系列数据。在 Java 中,流由字节组成。它被称为流,因为它就像一股持续流动的水流。

在 Java 中,为我们自动创建了 3 个流。所有这些流都连接到控制台。

1) System.out: 标准输出流

2) System.in: 标准输入流

3) System.err: 标准错误流

让我们看看将输出和错误消息打印到控制台的代码。

让我们看看从控制台获取输入的代码。

OutputStream 与 InputStream

下面将解释 OutputStream 和 InputStream 类。

OutputStream

Java 应用程序使用输出流将数据写入目标;目标可以是文件、数组、外围设备或套接字。

InputStream

Java 应用程序使用输入流从源读取数据;源可以是文件、数组、外围设备或套接字。

通过下面的图例,让我们了解 Java OutputStream 和 InputStream 类的作用。

Java IO

OutputStream 类

OutputStream 类是一个抽象类。它是所有表示字节输出流的类的超类。输出流接受输出字节并将其发送到某个接收器。

OutputStream 类的常用方法

方法描述
public void write(int) throws IOException它用于将一个字节写入当前输出流。
public void write(byte[])throws IOException它用于将一个字节数组写入当前输出流。
public void flush() throws IOException它刷新当前输出流。
public void close() throws IOException它用于关闭当前输出流。

OutputStream 继承结构

Java output stream hierarchy

InputStream 类

InputStream 类是一个抽象类。它是所有表示字节输入流的类的超类。

InputStream 类的常用方法

方法描述
public abstract int read() throws IOException它从输入流中读取下一个字节数据。它在文件末尾返回 -1。
public int available() throws IOException它返回当前输入流中可以读取的字节数的估计值。
public void close() throws IOException它用于关闭当前输入流。

InputStream 继承结构

Java input stream hierarchy

Java I/O 类

  1. Java 提供了丰富的类集来执行 I/O 操作。一些关键类包括:
  2. InputStream 和 OutputStream: 这些抽象类是面向字节的 I/O 操作的基础。它们提供了从各种源和目标读取和写入字节的方法。
  3. Reader 和 Writer: 这些抽象类用于面向字符的 I/O 操作。它们提供了从基于字符的流读取和写入字符的方法。
  4. FileInputStream 和 FileOutputStream: 这些类允许以面向字节的方式从文件读取和写入文件。
  5. FileReader 和 FileWriter: 这些类允许使用面向字符的操作从文件读取和写入文件。
  6. BufferedInputStream 和 BufferedOutputStream: 这些类提供缓冲功能,可以通过减少系统调用次数来显著提高 I/O 性能。
  7. BufferedReader 和 BufferedWriter: 这些类提供字符数据的缓冲读取和写入,提高了处理基于字符流的 I/O 效率。

Java I/O 的实际应用

Java I/O 应用于各种现实场景,包括:

  1. 文件处理: Java I/O 广泛用于从文件读取和写入文件。开发人员可以使用 Java 的文件 I/O 类来操作文件、创建目录以及执行与文件相关的操作。
  2. 网络通信: Java 的套接字类(Socket 和 ServerSocket)通过允许客户端和服务器应用程序通过 TCP/IP 进行数据交换来促进网络通信。
  3. 序列化: Java 的序列化机制允许将对象转换为字节流进行存储或传输。它在存储对象状态或在应用程序之间传输对象时特别有用。
  4. 数据处理: Java I/O 对于数据处理任务至关重要,例如解析文本文件、处理 CSV 数据以及通过 JDBC(Java 数据库连接)与数据库交互。

Java I/O 的最佳实践

在处理 Java I/O 时,请考虑以下最佳实践:

  1. 使用 try-with-resources: 在处理流时,始终使用 try-with-resources 语句来确保正确的资源管理。这会在不再需要流时自动关闭它们,从而防止资源泄漏。
  2. 使用缓冲 I/O: 尽可能使用缓冲 I/O 类来最大限度地减少系统调用次数并提高性能。
  3. 优雅地处理异常: 通过实现错误处理机制(例如日志记录或错误传播)来优雅地处理 I/O 异常。
  4. 使用 NIO 提高性能: 对于高性能的 I/O 操作,可以考虑使用 Java 的 NIO(New I/O)包,它提供了非阻塞 I/O 功能和增强的性能。

结论

Java I/O 是 Java 编程的基础部分,它提供了处理输入和输出操作的强大功能。通过理解 Java I/O 的核心概念、类和最佳实践,开发人员可以构建健壮高效的应用程序,这些应用程序可以无缝地与外部资源进行交互。无论是从文件读取、通过网络通信还是处理数据流,Java I/O 都提供了有效应对各种 I/O 任务所需的工具。


Java IO 选择题

1. 在 Java 中,以下哪个类用于读取字符流?

  1. FileInputStream
  2. FileReader
  3. BufferedReader
  4. InputStreamReader

答案:b)

解释: FileReader 专门用于从文件读取字符流。


2. Java I/O 中 BufferedWriter 类的作用是什么?

  1. 它用于从文件中读取二进制数据。
  2. 它用于向字符输出流写入文本,通过缓冲字符以实现高效写入。
  3. 它用于从字符输入流读取文本,通过缓冲字符以实现高效读取。
  4. 它用于向文件中写入二进制数据。

答案:b)

解释: BufferedWriter 通过缓冲字符,以高效地向字符输出流写入文本。


3. 在 Java 中,使用 BufferedReader 从文件中读取一行文本的哪个方法?

  1. readLine()
  2. read()
  3. readChar()
  4. readText()

答案:a)

解释: BufferedReader 的 readLine() 方法从输入流中读取一行文本。


4. Java 中 ObjectInputStream 类的作用是什么?

  1. 它用于将对象序列化为字节流。
  2. 它用于从字节流反序列化对象。
  3. 它用于从二进制流中读取基本数据类型。
  4. 它用于从文本文件中读取对象。

答案:b)

解释: ObjectInputStream 用于从字节流反序列化对象。


5. 关于 Java 中的 FileWriter 类,以下哪个陈述是正确的?

  1. 它用于使用二进制流向文件写入字符。
  2. 它用于使用字符流向文件写入字符。
  3. 它用于使用二进制流从文件中读取字符。
  4. 它用于使用字符流从文件中读取字符。

答案:b)

解释: FileWriter 专门用于向文件写入字符流。