Java 代码中的输入输出库是 Java 核心库的重要组成部分,它提供了丰富的类和接口用于数据的读写、文件操作、网络通信等。在 Java 中,我们主要使用 `java.io` 包,它是 Java 输入输出功能的基础。这个包包含了许多类,如 `File`, `InputStream`, `OutputStream`, `Reader`, `Writer`, `BufferedReader`, `BufferedWriter`, `FileReader`, `FileWriter` 等,它们各自承担不同的输入输出任务。
1. **基础概念**
- **流(Stream)**:Java 中的输入输出操作是基于流的概念进行的,流是一组有序的数据序列,可以是字符或字节。流分为输入流和输出流,分别负责数据的读取和写入。
- **字节流(Byte Stream)**:处理原始字节数据,如 `InputStream` 和 `OutputStream` 是所有字节输入输出流的超类。
- **字符流(Character Stream)**:处理 Unicode 字符数据,如 `Reader` 和 `Writer` 是所有字符输入输出流的超类。字符流通常用于文本处理,比字节流更高效。
2. **基本流类**
- **File类**:用于文件的创建、删除、重命名等操作,不直接涉及数据的读写。
- **InputStream/OutputStream**:字节输入输出流的基本类,提供基本的读写功能。
- **Reader/Writer**:字符输入输出流的基本类,处理字符数据。
3. **缓冲流(Buffered Stream)**
- **BufferedReader/BufferedWriter**:为提高性能,Java 提供了缓冲流,通过内部缓冲区来批量处理数据,减少系统调用次数。
- **BufferedInputStream/BufferedOutputStream**:类似地,缓冲字节流也用于提高读写性能。
4. **转换流(InputStreamReader/OutputStreamWriter)**
字节流与字符流之间的桥梁,它们允许我们将字节流转换为字符流,反之亦然。
5. **对象流(ObjectInputStream/ObjectOutputStream)**
用于序列化和反序列化 Java 对象,使得对象可以被写入输出流并从输入流中恢复。
6. **文件流(FileInputStream/FileOutputStream)**
直接操作文件的字节流,用于文件的读写操作。
7. **打印流(PrintStream/PrintWriter)**
支持格式化的输出,如打印换行、空格等。
8. **随机访问文件(RandomAccessFile)**
提供对文件的随机访问能力,可以定位到文件的任意位置进行读写。
9. **数据流(DataInputStream/DataOutputStream)**
用于读写基本数据类型和字符串,简化了数据的序列化过程。
在实际编程中,我们通常会根据需求选择合适的流类组合使用,例如,使用 `FileReader` 和 `BufferedReader` 读取文件,`FileWriter` 和 `BufferedWriter` 写入文件。同时,为了异常处理,我们通常会将流操作放在 `try-with-resources` 语句块中,确保资源的自动关闭。
例如,`main.java` 文件可能包含以下示例代码:
```java
import java.io.*;
public class Main {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
这段代码展示了如何使用 `BufferedReader` 从 `input.txt` 文件读取每一行内容,并用 `BufferedWriter` 将内容写入 `output.txt` 文件。注意,`try-with-resources` 语句块会自动关闭流,避免资源泄漏。