Java I/O 流体系详解与记忆方法
Java I/O 流体系详解与记忆方法
一、I/O 流核心框架
Java I/O 流体系是Java处理输入输出的核心API,主要分为两大阵营:
1. 按数据流向分(输入和输出是相对于内存而言的)
内存:临时存储数据的空间
硬盘:持久化设备
记忆:可以把内存比作大脑,本子记做硬盘,将内容写道本子上,就是输出/write
-
输入流:从外部读入程序(
InputStream
/Reader
)(从硬盘到内存) -
输出流:从程序写出到外部(
OutputStream
/Writer
)(从内存到硬盘)
2. 按数据类型分
类型 | 特点 | 抽象基类 | 单位 | 典型实现类 |
---|---|---|---|---|
字节流(一次读取一个字节) | 处理二进制数据,适合读取图片,声音,视频等文件。(当然字节流是万能的。什么都可以读和写) | InputStream | 字节 | FileInputStream |
OutputStream | FileOutputStream | |||
字符流(一次读取一个字符) | 处理文本数据,只适合读取普通文本 | Reader | 字符 | FileReader |
Writer | FileWriter |
二、核心类继承体系
字节流体系
mermaid
classDiagram
InputStream <|-- FileInputStream
InputStream <|-- ByteArrayInputStream
InputStream <|-- FilterInputStream
FilterInputStream <|-- BufferedInputStream
FilterInputStream <|-- DataInputStream
OutputStream <|-- FileOutputStream
OutputStream <|-- ByteArrayOutputStream
OutputStream <|-- FilterOutputStream
FilterOutputStream <|-- BufferedOutputStream
FilterOutputStream <|-- DataOutputStream
字符流体系
mermaid
classDiagram
Reader <|-- FileReader
Reader <|-- BufferedReader
Reader <|-- InputStreamReader
Writer <|-- FileWriter
Writer <|-- BufferedWriter
Writer <|-- OutputStreamWriter
三、关键装饰器模式
Java I/O 采用装饰器模式增强功能:
-
缓冲流:
BufferedInputStream
/BufferedReader
-
数据流:
DataInputStream
/DataOutputStream
-
对象序列化:
ObjectInputStream
/ObjectOutputStream
-
转换流:
InputStreamReader
/OutputStreamWriter
四、记忆口诀
1. 基础分类记忆法
"字节字符分两家,输入输出各不同"
字节流用于所有数据类型(如图片、视频)
字符流专为文本优化(自动处理编码)
2. 命名规律记忆
-
后缀规则:
-
InputStream
/OutputStream
→ 字节流(看结尾,结尾是Stream,就是字节流) -
Reader
/Writer
→ 字符流
-
-
前缀规则:
-
Buffered
→ 缓冲功能 -
Data
→ 基本数据类型读写 -
Object
→ 对象序列化
-
3. 生活场景联想
-
文件拷贝:
java
// 字节流适合任意文件 try (InputStream is = new FileInputStream("src.jpg"); OutputStream os = new FileOutputStream("dest.jpg")) { byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) != -1) { os.write(buffer, 0, len); } }
文本读取:
java
// 字符流+缓冲提升文本读取效率
try (BufferedReader br = new BufferedReader(new FileReader("text.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
五、面试高频问题
1. 字节流 vs 字符流如何选择?
-
字节流:处理二进制文件(如图片、压缩包)
-
字符流:处理文本文件(自动处理编码,如UTF-8)
2. 为什么需要缓冲流?
-
减少磁盘IO次数:默认每次read/write都直接操作磁盘,缓冲流在内存中积累数据后批量操作
-
性能对比:
java
// 无缓冲(慢)
FileInputStream fis = new FileInputStream("large.bin");
// 有缓冲(快10-100倍)
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("large.bin"));
3. 转换流(InputStreamReader)的作用?
-
桥梁作用:将字节流转换为字符流
-
指定编码:
java
// 显式指定GBK编码读取文本
new InputStreamReader(new FileInputStream("text.txt"), "GBK");
六、典型代码模板
1. 文件复制(字节流)
java
try (InputStream is = new FileInputStream("source");
OutputStream os = new FileOutputStream("target")) {
byte[] buf = new byte[8192];
int len;
while ((len = is.read(buf)) != -1) {
os.write(buf, 0, len);
}
}
2. 文本处理(字符流)
java
// 读取文本文件(自动处理编码)
try (BufferedReader br = new BufferedReader(new FileReader("text.txt"))) {
br.lines().forEach(System.out::println);
}
// 写入文本(追加模式)
try (BufferedWriter bw = new BufferedWriter(new FileWriter("log.txt", true))) {
bw.write("新的日志内容");
bw.newLine();
}