【Java笔记】No7.Java IO 流详解(超全版 | 含体系结构图 + 示例代码)
·
一、前言
在 Java 中,IO(Input/Output)流是所有数据读写的基础,无论是文件操作、网络通信,还是序列化、日志系统,都离不开 IO 流。
本文将从体系结构、核心类、使用场景、示例代码、最佳实践等多个维度,带你彻底掌握 Java IO 流。
目录
- IO 流的整体框架
- 四大抽象基类
- 字节流详解
- 字符流详解
- 缓冲流(性能提升关键)
- 转换流(编码处理核心)
- 数据流与对象流
- 文件操作常用类
- try-with-resources 最佳实践
- IO 流体系结构图
- 常见面试题
- 总结
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 场景。
更多推荐



所有评论(0)