Java IO 文件复制:字符缓冲流 & 字节缓冲流详解
·
文件复制是 Java IO 高频考点与实操需求,分两类场景:文本文件复制(字符缓冲流 BufferedReader/BufferedWriter)、任意格式文件万能复制(字节缓冲流 BufferedInputStream/BufferedOutputStream),缓冲流自带缓冲区,相比原生普通流读写效率大幅提升,是项目首选方案。
一、字符缓冲流:只用于文本文件复制(最常用)
1. 适用范围
仅能复制.txt、.java等纯文本文件,不能复制图片、视频、压缩包,底层基于字符编码,读写字符。
2. 核心 API
BufferedReader (字符输入缓冲)、BufferedWriter (字符输出缓冲),提供readLine()整行读取方法,文本处理极其方便。
3. 代码示例
java
运行
import java.io.*;
public class CharBufferCopy {
public static void main(String[] args) {
//源文件、目标文件路径
String srcPath = "src.txt";
String destPath = "copy.txt";
try(BufferedReader br = new BufferedReader(new FileReader(srcPath));
BufferedWriter bw = new BufferedWriter(new FileWriter(destPath))){
String line;
//按行读取文本
while((line = br.readLine()) != null){
bw.write(line);
bw.newLine(); //换行,还原原文件换行符
}
System.out.println("文本复制完成");
}catch (IOException e){
e.printStackTrace();
}
}
}
特点
readLine()一次性读一行字符串,不用手动定义数组,文本操作简洁;- 自带默认 8192 字符缓冲区,减少磁盘 IO 次数,性能优于 FileReader/FileWriter;
- 局限:非文本文件会出现乱码、文件损坏。
二、字节缓冲流:万能复制,支持任意文件(图片 / 视频 / 压缩包 / 文档全兼容)
1. 适用范围
所有格式文件通用,图片 jpg/png、mp4 视频、exe、zip 压缩包、文本全部可以复制,IO 底层以字节为单位,不涉及编码解析。
2. 核心 API
BufferedInputStream、BufferedOutputStream,默认 8192 字节缓冲区。
3. 代码示例
java
运行
import java.io.*;
public class ByteBufferCopy {
public static void main(String[] args) {
//可替换图片、视频、压缩包路径
String src = "test.jpg";
String dest = "copy.jpg";
try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest))){
byte[] buf = new byte[1024]; //自定义缓冲数组
int len;
while((len = bis.read(buf)) != -1){
bos.write(buf,0,len);
}
bos.flush(); //刷新缓冲区
System.out.println("任意文件复制完成");
}catch (IOException e){
e.printStackTrace();
}
}
}
特点
- 万能复制,开发中需要通用文件复制优先选用字节缓冲流;
- 双层缓冲:自带默认缓冲区 + 自定义 byte 数组,读写速度最优;
- 不解析字符编码,不存在乱码问题。
三、两种缓冲流对比总结
- 字符缓冲流 (BufferedReader/BufferedWriter) 适用:仅纯文本文件复制,优势:按行读写,文本处理便捷;缺点:无法处理非文本。
- 字节缓冲流 (BufferedInputStream/BufferedOutputStream) 适用:全部类型文件万能复制,图片、音视频、压缩包、文本通吃;缺点:不能按行读取文本,只能字节数组读写。
四、开发选型建议
- 只操作 txt 等文本 → 字符缓冲流(最常用);
- 不确定文件类型 / 图片视频 / 通用复制 → 字节缓冲流(万能首选);
- 缓冲流一律使用 try-with-resources 语法 (JDK7+),自动关闭流,不用手动 finally 释放资源。
补充小知识点
缓冲流本质是包装流,不直接对接文件,需要包装原生节点流 (FileInputStream/FileReader);缓冲流关闭时会自动刷新缓冲区,也可手动调用 flush () 强制刷盘。
更多推荐


所有评论(0)