一、场景说明
文本文件复制 字符流(FileReader/Writer) + 缓冲流(BufferedReader/Writer)
任意文件复制(图片、视频等)→ 字节流(FileInputStream/OutputStream) + 缓冲流
3.1 原理讲解
字节流:处理所有文件(图片、音频、视频、文本)
字符流:只处理文本文件,且能处理字符编码(UTF-8、GBK)
缓冲流:减少磁盘 I/O 次数,性能提升显著
3.2 文本文件复制(字符缓冲流)
public static void copyTextFile(String src, String dest) {
try (BufferedReader br = new BufferedReader(new FileReader(src));
BufferedWriter bw = new BufferedWriter(new FileWriter(dest))) {
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine(); // 注意跨平台换行
}
} catch (IOException e) {
e.printStackTrace();
}
}
强调
readLine()和newLine()的配合说明
FileReader使用默认编码(建议指定编码:new InputStreamReader(new FileInputStream(src), "UTF-8"))
3.3 任意文件复制(字节缓冲流)
public static void copyBinaryFile(String src, String dest) {
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest))) {
byte[] buffer = new byte[8192]; // 8KB 缓冲区
int len;
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
解释字节缓冲流的内部默认缓存(8KB)
对比不使用缓冲流(单字节读写)的极低效率
3.4 性能对比实验(可选,增加说服力)
复制一个 100MB 文件:无缓冲流 → 可能几十秒;有缓冲流 → 不到 1 秒
可附上测试代码和结果截图
3.5 异常处理与资源关闭(重点)
旧写法:
finally中关闭流,很繁琐新写法:
try-with-resources(Java 7+),自动关闭强调顺序:先打开的后关闭,但 try 块中自动处理正确顺序
3.6 总结与扩展
字符流专门处理文本,字节流万能
始终使用缓冲流包装底层流
扩展:
Files.copy()工具类(NIO 方式,更简洁)