一、前言

在 Java 中,IO(Input/Output)流是所有数据读写的基础,无论是文件操作、网络通信,还是序列化、日志系统,都离不开 IO 流。
本文将从体系结构、核心类、使用场景、示例代码、最佳实践等多个维度,带你彻底掌握 Java IO 流。


目录

  1. IO 流的整体框架
  2. 四大抽象基类
  3. 字节流详解
  4. 字符流详解
  5. 缓冲流(性能提升关键)
  6. 转换流(编码处理核心)
  7. 数据流与对象流
  8. 文件操作常用类
  9. try-with-resources 最佳实践
  10. IO 流体系结构图
  11. 常见面试题
  12. 总结

1. IO 流的整体框架

Java IO 的本质是:以流的方式读写数据

按方向分类

  • 输入流:数据进入程序(Input)
  • 输出流:数据从程序写出(Output)

按数据类型分类

  • 字节流:处理所有类型数据(图片、视频、二进制)
  • 字符流:专门处理文本(自动处理编码)

按功能分类

  • 节点流:直接连接数据源(文件、数组、网络)
  • 处理流:对节点流增强功能(缓冲、转换、对象序列化)

2. 四大抽象基类(IO 的根)

抽象类 说明
InputStream 字节输入流
OutputStream 字节输出流
Reader 字符输入流
Writer 字符输出流

所有 IO 类都继承自这四个基类。


3. 字节流详解(InputStream / OutputStream)

适合处理:图片、视频、音频、压缩包等二进制文件。

3.1 FileInputStream / FileOutputStream

读取文件(字节方式)

try (FileInputStream fis = new FileInputStream("a.jpg")) {
    byte[] buffer = new byte[1024];
    int len;
    while ((len = fis.read(buffer)) != -1) {
        System.out.println("读取了 " + len + " 字节");
    }
}

写入文件

try (FileOutputStream fos = new FileOutputStream("copy.jpg")) {
    fos.write("Hello".getBytes());
}

4. 字符流详解(Reader / Writer)

适合处理:文本文件(自动处理编码)

4.1 FileReader / FileWriter

try (FileReader fr = new FileReader("a.txt");
     FileWriter fw = new FileWriter("b.txt")) {
    char[] buf = new char[1024];
    int len;
    while ((len = fr.read(buf)) != -1) {
        fw.write(buf, 0, len);
    }
}

5. 缓冲流(性能提升关键)

缓冲流通过内部缓冲区减少磁盘访问次数,大幅提升 IO 性能。

5.1 字节缓冲流

try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.mp4"));
     BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("b.mp4"))) {
    byte[] buf = new byte[8192];
    int len;
    while ((len = bis.read(buf)) != -1) {
        bos.write(buf, 0, len);
    }
}

5.2 字符缓冲流(支持按行读取)

try (BufferedReader br = new BufferedReader(new FileReader("a.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
}

6. 转换流(编码处理核心)

用于字节流与字符流之间的转换,解决编码问题。

Reader reader = new InputStreamReader(new FileInputStream("a.txt"), "UTF-8");
Writer writer = new OutputStreamWriter(new FileOutputStream("b.txt"), "UTF-8");

7. 数据流与对象流

7.1 DataInputStream / DataOutputStream(基本类型读写)

DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.bin"));
dos.writeInt(100);
dos.writeDouble(3.14);
dos.close();

7.2 ObjectInputStream / ObjectOutputStream(对象序列化)

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.bin"));
oos.writeObject(new User("xin", 18));
oos.close();

8. 文件操作常用类(File / Files)

8.1 File 类

File file = new File("test.txt");
System.out.println(file.exists());
System.out.println(file.getAbsolutePath());

8.2 NIO Files 工具类(推荐)

Files.copy(Paths.get("a.txt"), Paths.get("b.txt"));

9. try-with-resources(IO 最佳实践)

自动关闭流,避免资源泄漏。

try (FileInputStream fis = new FileInputStream("a.txt")) {
    // 使用 fis
}

10. IO 流体系结构图(ASCII 图示)

                           ┌─────────────────────┐
                           │     InputStream     │
                           └───────┬─────────────┘
                                   │
        ┌──────────────────────────┼──────────────────────────┐
        │                          │                          │
 FileInputStream        BufferedInputStream         DataInputStream
        │                          │                          │
        └──────────────────────────┴──────────────────────────┘

                           ┌─────────────────────┐
                           │     OutputStream    │
                           └───────┬─────────────┘
                                   │
        ┌──────────────────────────┼──────────────────────────┐
        │                          │                          │
 FileOutputStream       BufferedOutputStream        DataOutputStream
        │                          │                          │
        └──────────────────────────┴──────────────────────────┘


                           ┌─────────────────────┐
                           │       Reader        │
                           └───────┬─────────────┘
                                   │
                     FileReader   BufferedReader


                           ┌─────────────────────┐
                           │       Writer        │
                           └───────┬─────────────┘
                                   │
                     FileWriter   BufferedWriter

11. 常见面试题

  • 字节流和字符流的区别?
  • 为什么需要缓冲流?
  • FileReader 能读图片吗?为什么?
  • 对象序列化的要求是什么?
  • 什么是 try-with-resources?为什么推荐使用?

12. 总结

Java IO 流体系庞大,但核心逻辑非常清晰:
字节 vs 字符、输入 vs 输出、节点流 vs 处理流
掌握这些核心,再结合缓冲流、转换流、对象流,就能应对绝大多数 IO 场景。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐