Java IO流全面解析:从基础到高级应用(图文详解版)

Java IO流全面解析:从基础到高级应用(图文详解版)


目录


一、IO流概述

1.1 IO流分类体系

IO流
按流向
按数据类型
输入流
输出流
字节流
字符流

1.2 核心类继承关系

InputStream
FileInputStream
BufferedInputStream
OutputStream
FileOutputStream
BufferedOutputStream
Reader
FileReader
BufferedReader
Writer
FileWriter
BufferedWriter

二、字节流详解

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读文件

程序 文件 控制台 创建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 乱码产生原理

用UTF-8解码
源文件GBK编码
乱码文本

四、字符流详解

4.1 字符流缓冲区机制

缓冲区满时自动写入
调用flush强制写入
程序
8KB字符数组
目标文件

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 缓冲流性能对比

88% 12% 1GB文件拷贝耗时对比 基础字节流 缓冲字节流

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 编码转换流程

GBK文件 InputStreamReader UTF-8文件 字节流输入 字符流输出 GBK文件 InputStreamReader UTF-8文件

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 序列化过程

程序 ObjectOutputStream 文件 ObjectInputStream writeObject(user) 写入二进制数据 读取二进制数据 readObject()返回User对象 程序 ObjectOutputStream 文件 ObjectInputStream

7.2 关键代码

// User类需实现Serializable接口
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private transient String password; // 不被序列化
}

八、打印流

8.1 打印流体系

OutputStream
PrintStream
+print(String)
+printf()
Writer
PrintWriter
+println(Object)

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文件结构

ZIP文件
Local File Header
File Data
Central Directory
End of Central Directory

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);

总结

核心要点梳理

  1. 流类型选择原则

    • 文本数据优先字符流(Reader/Writer)
    • 二进制数据使用字节流(InputStream/OutputStream)
  2. 性能优化技巧

    • 始终使用缓冲流包装基础流
    • 合理设置缓冲区大小(通常8KB-32KB)
    • 及时关闭资源(try-with-resources)
  3. 常见问题解决方案

    乱码问题
    统一使用UTF-8编码
    文件过大处理慢
    使用缓冲流+合理缓冲区
    对象持久化
    实现Serializable接口

最佳实践建议

  • 文件操作始终指定字符集
  • 序列化类保持serialVersionUID一致
  • 使用工具包简化常见IO操作
  • 处理压缩文件时注意目录结构

通过本文的系统学习,配合图表和代码示例,您已掌握Java IO流的核心知识体系。建议结合实际项目需求,灵活运用不同流类型和工具包,提升开发效率和程序健壮性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值