上午 3h:字符流全套核心
1. 字符流概述(0.4h)
1.1 为什么需要字符流?
- 字节流 :万能,适合图片 / 视频 / 压缩包,但读取中文会乱码
- 字符流 :专门给纯文本设计(.txt/.java/.md/.json)
- 字符流 = 字节流 + 编码表(自动处理中文)
1.2 核心体系
plaintext
Reader 字符输入流(读)
└── FileReader
Writer 字符输出流(写)
└── FileWriter
1.3 必背规则
- 纯文本 → 字符流
- 非文本(图片、音频、视频)→ 字节流
2. 字符输出流 FileWriter(1.2h)
2.1 作用
往文本文件写字符 / 字符串,自动处理中文。
2.2 核心方法
write(int c):写单个字符write(char[] ch):写字符数组write(String str):直接写字符串(最常用)flush():刷新缓冲区(数据写入文件)close():关闭流(自带 flush)
✅ 完整代码:FileWriter 覆盖写入
java
运行
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
// 1. 创建字符输出流(覆盖模式)
FileWriter fw = new FileWriter("D:\\JavaDay17\\fw.txt");
// 2. 写数据
fw.write(97); // 写单个字符 a
fw.write("中文字符没问题!"); // 直接写字符串
fw.write("\n"); // 换行
fw.write("Hello FileWriter");
// 3. 关闭流(必须!自带flush)
fw.close();
}
}
代码解释
FileWriter("路径"):文件不存在自动创建write(字符串):字符流最大优势,直接写中文close():不关闭 → 数据留在缓冲区,文件为空
✅ 完整代码:FileWriter 追加写入(不覆盖)
java
运行
FileWriter fw = new FileWriter("D:\\JavaDay17\\fw.txt", true);
fw.write("我是追加的内容\n");
fw.close();
- 第二个参数 true = 追加
- 不加 true = 覆盖(清空原有内容)
3. 字符输入流 FileReader(1.4h)
3.1 作用
读取文本文件,解决中文乱码。
3.2 两种读取方式
- 单个字符读取(理解用)
- 字符数组读取(企业标准,高效)
✅ 完整代码:FileReader 字符数组读取(推荐)
java
运行
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
// 1. 创建字符输入流
FileReader fr = new FileReader("D:\\JavaDay17\\fw.txt");
// 2. 字符数组读取(高效)
char[] chs = new char[1024];
int len;
while ((len = fr.read(chs)) != -1) {
System.out.print(new String(chs, 0, len));
}
// 3. 关闭流
fr.close();
}
}
逐行解释
fr.read(chs):一次读一堆字符到数组len:读到的有效字符个数new String(chs,0,len):把有效字符转成字符串- 读到
-1= 文件结束
下午 2.5h:IO 异常处理 + 缓冲流
1. IO 流标准异常处理(1h)
1.1 为什么必须处理?
- 流不关闭 → 文件被锁定、资源泄漏
- 不捕获异常 → 程序直接崩溃
1.2 JDK7 最优雅写法:try-with-resources
**自动关闭流,不用写 close ()**企业开发 100% 用这个!
✅ 完整代码:标准异常处理(必背)
java
运行
import java.io.FileReader;
import java.io.FileWriter;
public class IOTryResource {
public static void main(String[] args) {
// 自动释放资源,不用close()
try (
FileReader fr = new FileReader("源文件.txt");
FileWriter fw = new FileWriter("目标文件.txt");
) {
char[] chs = new char[1024];
int len;
while ((len = fr.read(chs)) != -1) {
fw.write(chs, 0, len);
}
System.out.println("复制完成");
} catch (Exception e) {
e.printStackTrace();
}
}
}
优势
- 自动关闭流
- 代码极简
- 不会资源泄漏
2. 缓冲流原理(0.5h)
2.1 为什么快?
- 普通流:一次读写 1 个字节 / 字符 → 慢
- 缓冲流:自带8192 缓冲区 → 一次读写一大块 → 快 10~100 倍
2.2 四大缓冲流
plaintext
字节缓冲流
BufferedInputStream(高效读)
BufferedOutputStream(高效写)
字符缓冲流
BufferedReader(高效按行读)
BufferedWriter(高效按行写)
3. 四大缓冲流实操(1h)
3.1 字节缓冲流:复制大文件(图片 / 视频)
✅ 完整代码(企业标准)
java
运行
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class BufferCopy {
public static void main(String[] args) {
try (
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("1.jpg"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.jpg"));
) {
byte[] bys = new byte[8192];
int len;
while ((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
}
System.out.println("复制完成!速度极快");
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.2 字符缓冲流(重点:特有方法)
BufferedReader:readLine () 读取一行 BufferedWriter:newLine () 跨平台换行
✅ 完整代码:按行读取文本(超级常用)
java
运行
import java.io.BufferedReader;
import java.io.FileReader;
public class BufferReaderLine {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("fw.txt"))) {
String line;
// 一次读一行,直到null
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
✅ 完整代码:按行写入 + 跨平台换行
java
运行
import java.io.BufferedWriter;
import java.io.FileWriter;
public class BufferWriterDemo {
public static void main(String[] args) {
try (BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"))) {
bw.write("第一行");
bw.newLine(); // 跨平台换行
bw.write("第二行");
} catch (Exception e) {
e.printStackTrace();
}
}
}
晚上 1.5h:综合练习 + 复盘巩固
练习 1:文本文件复制(字符流标准案例)
java
运行
import java.io.FileReader;
import java.io.FileWriter;
public class TextCopy {
public static void main(String[] args) {
try (
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
) {
char[] chs = new char[1024];
int len;
while ((len = fr.read(chs)) != -1) {
fw.write(chs, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
练习 2:缓冲流按行读取 + 打印
java
运行
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
我为你补充的【计划遗漏的关键知识点】
(非常重要,考试 / 面试必问)
1. 编码问题(GBK / UTF-8)
- FileReader/FileWriter 默认使用系统编码
- 乱码解决:使用
InputStreamReader / OutputStreamWriter指定编码
2. flush 与 close 的区别
- flush:刷新缓冲区,流还可以继续用
- close:关闭流,刷新缓冲区,流不能再用
3. 换行规范
\n:Linux/Mac\r\n:Windows- newLine():跨平台自动适配
4. 资源泄漏危害
- 不关闭流 → 文件占用 → 无法删除 / 修改
5. 缓冲区大小
- 默认 8192(8KB)
- 开发固定写
8192或1024*8
今日终极总结(必背)
- 纯文本用字符流,其他用字节流
- 字符流解决中文乱码
- 缓冲流 = 高速读写
- 字符缓冲流最强:readLine () /newLine ()
- 企业必须用 try-with-resources 自动关流
- 不关闭流 = 文件损坏 / 无法写入 / 资源泄漏
总结
Java 字节流 & 字符流 超精炼总结 + 对照表
一、核心一句话总总结
- 字节流 :底层原始字节,万能 ,能复制所有文件 (图片 / 视频 / 音频 / 压缩包 / 文本),读写中文需手动转
getBytes(),容易乱码。 - 字符流 :字节流 + 编码表,只适合纯文本 (txt/java/md),天生处理中文不乱码,可直接读写字符串,不能复制图片视频。
- 输入流 :数据从硬盘进程序 → 读文件
- 输出流 :数据从程序出到硬盘 → 写文件
- 缓冲流 :给基础流套一层缓冲区,大幅提高读写效率,字符缓冲流独有按行读写方法。
二、字节流 vs 字符流 详细对比表
表格
| 对比维度 | 字节流 | 字符流 |
|---|---|---|
| 顶层父类 | InputStream / OutputStream | Reader / Writer |
| 常用基础类 | FileInputStream / FileOutputStream | FileReader / FileWriter |
| 缓冲流 | BufferedInputStream / BufferedOutputStream | BufferedReader / BufferedWriter |
| 处理单位 | 一个字节 | 一个字符 |
| 适用文件 | 所有文件:图片、视频、音频、exe、压缩包、文本 | 只适合纯文本:txt、java、md |
| 中文支持 | 不自带编码,需手动 getBytes(),易乱码 |
自带编码表,中文天然不乱码 |
| 读写字符串 | 无直接写字符串方法,必须转字节数组 | 可直接 write(字符串),无需转换 |
| 文件自动创建 | FileOutputStream 文件不存在自动创建 | FileWriter 文件不存在自动创建 |
| 追加写入 | 构造方法传 true |
构造方法传 true |
| 特有方法 | 无特有便捷方法 | BufferedReaderreadLine()、BufferedWriternewLine() |
| 能否复制图片 | ✅ 可以 | ❌ 不可以,复制后损坏 0KB |
| 效率 | 基础流慢,缓冲流快 | 基础流慢,缓冲流快 |
三、使用场景选择口诀(必背)
看文件选流:
- 图片、视频、音乐、压缩包、exe → 只用字节流
- txt、java 源码、纯文本 → 优先字符流
看动作选流:
- 读文件(硬盘→程序)→ InputStream / Reader
- 写文件(程序→硬盘)→ OutputStream / Writer
四、四大基础流固定用法记忆
- 字节读:FileInputStream → byte [] 数组循环读
- 字节写 :FileOutputStream → 字符串要
.getBytes() - 字符读:FileReader → char [] 数组循环读,中文不乱码
- 字符写:FileWriter → 直接 write (字符串)
五、缓冲流额外重点(补充)
- 缓冲流不能单独用,必须包装基础流
- 字节缓冲流:只提升速度,无特殊方法
- 字符缓冲流:
readLine():一次性读一整行文本newLine():跨平台自动换行,比\n专业
六、你以后永远不会错的规则
- 复制图片 / 视频 绝对不用字符流,必损坏、0KB 打不开
- 写纯文本中文 优先字符流,省事不乱码
- 所有 IO 流用完必须关闭 ,企业开发用
try-with-resources自动关 - 只要路径不对 → 找不到文件 → 复制出 0KB 空文件