第五章:输入输出(IO)
5.1 IO流概述
1. 什么是IO流
IO(Input/Output)流是Java中用于处理输入和输出操作的核心机制。它提供了一种统一的方式来读取和写入数据,无论是从文件、网络连接、内存缓冲区还是其他数据源。IO流可以看作是数据的流动管道,数据从源头(如文件)流向目标(如程序内存),或反之。
2. IO流的分类
Java中的IO流主要分为以下几类:
2.1 按数据流向
- 输入流(InputStream/Reader):用于从数据源读取数据到程序中。
- 输出流(OutputStream/Writer):用于将程序中的数据写入到目标位置。
2.2 按数据类型
- 字节流(Byte Streams):以字节为单位读写数据,适用于二进制文件(如图片、音频等)。
- 输入流:
InputStream及其子类(如FileInputStream)。 - 输出流:
OutputStream及其子类(如FileOutputStream)。
- 输入流:
- 字符流(Character Streams):以字符为单位读写数据,适用于文本文件。
- 输入流:
Reader及其子类(如FileReader)。 - 输出流:
Writer及其子类(如FileWriter)。
- 输入流:
2.3 按功能
- 节点流(Node Streams):直接与数据源或目标交互的流(如
FileInputStream)。 - 处理流(Processing Streams):对节点流进行封装,提供额外功能(如缓冲、数据转换等),例如:
BufferedInputStream:提供缓冲功能,提高读取效率。DataInputStream:支持基本数据类型的读取。
3. IO流的层次结构
Java的IO流类库采用了装饰器模式(Decorator Pattern),通过组合不同的流类来实现灵活的功能扩展。例如:
// 使用缓冲流包装文件输入流,提高读取效率
InputStream in = new BufferedInputStream(new FileInputStream("example.txt"));
4. 常见的IO流类
以下是Java IO包中一些重要的类:
| 类名 | 描述 |
|---|---|
FileInputStream | 从文件读取字节的输入流 |
FileOutputStream | 向文件写入字节的输出流 |
FileReader | 从文件读取字符的输入流 |
FileWriter | 向文件写入字符的输出流 |
BufferedReader | 提供缓冲功能的字符输入流 |
BufferedWriter | 提供缓冲功能的字符输出流 |
ObjectInputStream | 用于反序列化对象的输入流 |
ObjectOutputStream | 用于序列化对象的输出流 |
5. IO流的基本使用步骤
以下是使用IO流的典型流程:
- 创建流对象:根据需求选择输入流或输出流,并绑定数据源或目标。
- 读写数据:调用流的读写方法(如
read()、write())。 - 关闭流:调用
close()方法释放资源(推荐使用try-with-resources语法自动关闭)。
示例代码:
// 使用try-with-resources自动关闭流
try (FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("output.txt")) {
int data;
while ((data = fis.read()) != -1) {
fos.write(data);
}
} catch (IOException e) {
e.printStackTrace();
}
6. 注意事项
- 资源释放:必须关闭流以避免资源泄漏。
- 异常处理:IO操作可能抛出
IOException,需妥善处理。 - 性能优化:对于频繁读写操作,建议使用缓冲流(如
BufferedInputStream)。
通过本节的学习,读者可以掌握Java IO流的基本概念和分类,为后续深入学习字节流、字符流和文件操作打下基础。
