一、IO 流体系与分类
1. 核心分类
IO 流从两个核心维度划分:
- 按流的方向 :
- 输入流:读取数据(从文件 / 网络到程序)
- 输出流:写出数据(从程序到文件 / 网络)
- 按操作文件类型 :
- 字节流:可操作所有文件(图片、音频、视频、文本等)
- 字符流:仅操作纯文本文件(
.txt、.java等)
2. 体系结构
- 字节流顶层父类:
InputStream(字节输入流)、OutputStream(字节输出流) - 字符流顶层父类:
Reader(字符输入流)、Writer(字符输出流) - 字符流本质:字符流 = 字节流 + 字符集,底层会自动处理编码 / 解码,避免乱码。
二、字节流(FileInputStream / FileOutputStream)
1. FileInputStream(读取字节)
- 创建对象:文件不存在直接报错,需确保路径有效。
- 读取方法 :
read():一次读一个字节,返回 ASCII 码值,读到末尾返回-1。read(byte[] buffer):一次读一个字节数组,返回实际读取字节数,读到末尾返回-1。
- 释放资源 :必须调用
close()释放资源,避免泄漏。
2. FileOutputStream(写入字节)
- 创建对象 :
- 参数支持字符串路径或
File对象。 - 文件不存在会自动创建,但父级路径必须存在。
- 文件已存在默认清空内容,可通过构造方法开启续写。
- 参数支持字符串路径或
- 写入方法 :
write(int b):一次写一个字节,参数int实际写入低 8 位对应的 ASCII 字符。write(byte[] b):一次写一个字节数组。write(byte[] b, int off, int len):写字节数组的部分数据。
- 换行 :Windows 系统换行符为
\r\n。 - 释放资源 :必须调用
close()释放资源。
三、字符流(FileReader / FileWriter)
1. FileReader(读取字符)
- 构造方法 :
FileReader(File file):关联本地文件创建字符输入流。FileReader(String pathname):通过路径字符串创建字符输入流。
- 读取方法 :
read():一次读一个字符,读到末尾返回-1。read(char[] buffer):一次读一个字符数组,返回实际读取字符数,读到末尾返回-1。
- 释放资源 :调用
close()释放资源 / 关流。
2. FileWriter(写入字符)
- 构造方法 :
FileWriter(File file)/FileWriter(String pathname):创建字符输出流,默认清空文件。FileWriter(File file, boolean append)/FileWriter(String pathname, boolean append):开启续写开关,不清空文件。
- 写入细节 :
write(int c):参数为整数,实际写入字符集对应字符。- 支持写入字符串、字符数组等。
- 释放资源 :必须调用
close()释放资源。
四、编码与解码
1. 编码(字符串 → 字节数组)
String.getBytes():使用默认编码方式编码。String.getBytes(String charsetName):使用指定编码(如UTF-8、GBK)编码。
2. 解码(字节数组 → 字符串)
new String(byte[] bytes):使用默认编码方式解码。new String(byte[] bytes, String charsetName):使用指定编码解码。
3. 乱码避免规则
- 不要用字节流读取文本文件,优先使用字符流。
- 编码和解码必须使用同一个码表和编码方式。
五、异常处理(try...catch...finally)
IO 操作会抛出 IOException,必须显式处理,推荐 try...catch...finally 结构:
java
运行
FileWriter fw = null;
try {
fw = new FileWriter("test.txt");
fw.write("Hello, IO流!");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fw != null) {
try {
fw.close(); // 确保资源释放
} catch (IOException e) {
e.printStackTrace();
}
}
}
finally块代码一定会执行(除非虚拟机停止),用于保证资源释放
六、实操选择指南
表格
| 场景 | 推荐流类型 | 核心原因 |
|---|---|---|
| 操作图片、音频、视频 | 字节流(FileInputStream/FileOutputStream) | 字节流支持所有文件类型 |
| 操作纯文本文件(读写中文) | 字符流(FileReader/FileWriter) | 自动处理编码,避免乱码 |
| 大文件复制 | 字节流 + 字节数组缓冲 | 减少 IO 次数,提升效率 |
