Java IO流全面解析:从基础到高级应用(图文详解版)
目录
一、IO流概述
1.1 IO流分类体系
1.2 核心类继承关系
二、字节流详解
2.1 FileOutputStream写文件
// 创建字节输出流(追加模式)
try (FileOutputStream fos = new FileOutputStream("data.txt", true)) {
fos.write("Hello".getBytes()); // 写入字节
fos.write("\r\n".getBytes()); // 写入换行符
} catch (IOException e) {
e.printStackTrace();
}
2.2 FileInputStream读文件
2.3 文件拷贝实战
try (FileInputStream fis = new FileInputStream("src.jpg");
FileOutputStream fos = new FileOutputStream("dest.jpg")) {
byte[] buffer = new byte[8192]; // 8KB缓冲区
int len;
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
}
三、字符集与乱码问题
3.1 常见编码对比
编码类型 | 特点 | 汉字字节数 | 适用场景 |
---|---|---|---|
ASCII | 基础128字符 | 不支持 | 英文文本 |
GBK | 中文扩展 | 2字节 | 中文Windows系统 |
UTF-8 | 变长编码(1-4字节) | 3字节 | 跨平台国际通用 |
3.2 乱码产生原理
四、字符流详解
4.1 字符流缓冲区机制
4.2 FileReader读取示例
try (FileReader fr = new FileReader("input.txt")) {
char[] buffer = new char[1024];
int len;
while ((len = fr.read(buffer)) != -1) {
System.out.print(new String(buffer, 0, len));
}
}
五、缓冲流
5.1 缓冲流性能对比
5.2 字符缓冲流特有方法
try (BufferedReader br = new BufferedReader(new FileReader("log.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("newlog.txt"))) {
String line;
while ((line = br.readLine()) != null) { // 读取整行
bw.write(line);
bw.newLine(); // 写入换行符
}
}
六、转换流
6.1 编码转换流程
6.2 实战代码
try (InputStreamReader isr = new InputStreamReader(
new FileInputStream("gbk.txt"), "GBK");
OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream("utf8.txt"), "UTF-8")) {
char[] buffer = new char[1024];
int len;
while ((len = isr.read(buffer)) != -1) {
osw.write(buffer, 0, len);
}
}
七、序列化与反序列化流
7.1 序列化过程
7.2 关键代码
// User类需实现Serializable接口
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private transient String password; // 不被序列化
}
八、打印流
8.1 打印流体系
8.2 格式化输出示例
try (PrintWriter pw = new PrintWriter("report.txt")) {
pw.println("===== 系统报告 =====");
pw.printf("时间: %tF %<tT%n", new Date());
pw.printf("CPU使用率: %.2f%%", 78.932);
}
九、压缩与解压缩流
9.1 ZIP文件结构
9.2 压缩文件夹
try (ZipOutputStream zos = new ZipOutputStream(
new FileOutputStream("docs.zip"))) {
File dir = new File("documents");
for (File file : dir.listFiles()) {
zos.putNextEntry(new ZipEntry(file.getName()));
Files.copy(file.toPath(), zos);
zos.closeEntry();
}
}
十、工具包推荐
10.1 Commons-IO常用方法
功能 | 方法 | 示例 |
---|---|---|
快速复制文件 | FileUtils.copyFile() | copyFile(src, dest) |
递归删除目录 | FileUtils.deleteDirectory() | deleteDirectory(dir) |
读取文件为字符串 | FileUtils.readFileToString() | readFileToString(file, "UTF-8") |
10.2 Hutool示例
// 自动识别编码读取
String content = FileUtil.readUtf8String("data.txt");
// 递归拷贝目录
FileUtil.copyContent(new File("src"), new File("dest"), true);
总结
核心要点梳理
-
流类型选择原则
- 文本数据优先字符流(Reader/Writer)
- 二进制数据使用字节流(InputStream/OutputStream)
-
性能优化技巧
- 始终使用缓冲流包装基础流
- 合理设置缓冲区大小(通常8KB-32KB)
- 及时关闭资源(try-with-resources)
-
常见问题解决方案
最佳实践建议
- 文件操作始终指定字符集
- 序列化类保持serialVersionUID一致
- 使用工具包简化常见IO操作
- 处理压缩文件时注意目录结构
通过本文的系统学习,配合图表和代码示例,您已掌握Java IO流的核心知识体系。建议结合实际项目需求,灵活运用不同流类型和工具包,提升开发效率和程序健壮性。