Java中的Java I/O流体系详解
字数 1432 2025-11-08 20:56:49
Java中的Java I/O流体系详解
描述
Java I/O流是Java中处理输入输出的核心机制,提供了读写各种数据源(文件、网络、内存等)的统一抽象。I/O流体系庞大而复杂,理解其层次结构和设计思想对编写高效、正确的I/O程序至关重要。
知识要点讲解
1. I/O流的基本概念与分类
- 流(Stream):数据流动的抽象概念,数据从源(Source)流向目标(Sink)
- 按流向分类:
- 输入流(InputStream/Reader):从数据源读取数据到程序
- 输出流(OutputStream/Writer):从程序写出数据到目标
- 按数据类型分类:
- 字节流:以字节(8bit)为单位,可处理所有类型数据
- 字符流:以字符(16bit)为单位,专门处理文本数据,支持字符编码
2. 字节流体系结构
- 顶层抽象类:
InputStream:所有字节输入流的父类OutputStream:所有字节输出流的父类
- 核心方法:
// InputStream int read() // 读取单个字节 int read(byte[] b) // 读取到字节数组 void close() // 关闭流 // OutputStream void write(int b) // 写入单个字节 void write(byte[] b) // 写入字节数组 void flush() // 刷新缓冲区 void close() // 关闭流
3. 字符流体系结构
- 设计目的:解决字节流处理文本时的编码问题
- 顶层抽象类:
Reader:所有字符输入流的父类Writer:所有字符输出流的父类
- 核心方法:
// Reader int read() // 读取单个字符 int read(char[] cbuf) // 读取到字符数组 // Writer void write(int c) // 写入单个字符 void write(char[] cbuf) // 写入字符数组 void write(String str) // 写入字符串
4. 装饰器模式在I/O流中的应用
- 设计思想:通过组合方式动态扩展功能
- 工作方式:装饰器类包裹被装饰的流对象
- 典型装饰器:
BufferedInputStream/BufferedOutputStream:提供缓冲功能DataInputStream/DataOutputStream:支持基本数据类型读写BufferedReader/BufferedWriter:字符流的缓冲功能PrintStream/PrintWriter:格式化输出
5. 文件I/O操作详解
- 文件字节流:
// 文件复制示例 try (FileInputStream fis = new FileInputStream("source.txt"); FileOutputStream fos = new FileOutputStream("target.txt")) { byte[] buffer = new byte[1024]; int length; while ((length = fis.read(buffer)) != -1) { fos.write(buffer, 0, length); } } - 文件字符流:
// 文本文件读取示例(带缓冲) try (BufferedReader reader = new BufferedReader(new FileReader("text.txt"))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } }
6. 转换流:字节流与字符流的桥梁
- InputStreamReader:将字节输入流转换为字符输入流
- OutputStreamWriter:将字符输出流转换为字节输出流
- 编码处理:
// 指定字符编码读取文件 Reader reader = new InputStreamReader( new FileInputStream("file.txt"), "UTF-8");
7. 对象序列化流
- ObjectInputStream/ObjectOutputStream:实现Java对象序列化
- 序列化要求:实现
Serializable接口 - transient关键字:标记不被序列化的字段
- serialVersionUID:控制版本兼容性
8. 其他重要流类
- 字节数组流:
ByteArrayInputStream/ByteArrayOutputStream - 数据流:
DataInputStream/DataOutputStream(读写基本数据类型) - 打印流:
PrintStream/PrintWriter(格式化输出) - 管道流:
PipedInputStream/PipedOutputStream(线程间通信)
9. NIO.2中的Files类(Java 7+)
- 简化文件操作:提供静态方法完成常见文件任务
- 示例代码:
// 读取所有行 List<String> lines = Files.readAllLines(Paths.get("file.txt")); // 写入文件 Files.write(Paths.get("output.txt"), content.getBytes());
10. 最佳实践与注意事项
- 使用try-with-resources:自动关闭资源,避免资源泄漏
- 合理使用缓冲:减少I/O操作次数,提升性能
- 注意字符编码:明确指定字符集,避免乱码问题
- 大文件处理:使用缓冲和分块读写,避免内存溢出
通过理解Java I/O流的层次结构和设计模式,可以更灵活地选择适合的流类来处理不同的I/O场景,写出高效可靠的I/O代码。