一、前言在 Java IO 编程和竞赛场景中文件复制是高频考点也是日常开发的必备技能。本文将从最常用的文本文件复制字符缓冲流入手延伸到支持所有文件类型的万能复制字节缓冲流带你彻底掌握两种方案的原理、代码实现和适用场景解决你在不同场景下的文件复制需求。二、文本文件复制字符缓冲流最常用1. 适用场景字符缓冲流BufferedReader/BufferedWriter专门用于处理纯文本文件如.txt、.java、.md、.html等对中文等字符编码友好支持按行读写是文本文件复制的首选方案。2. 核心原理BufferedReader为FileReader增加缓冲区按行读取文本readLine()减少磁盘 IO 次数大幅提升读取效率。BufferedWriter为FileWriter增加缓冲区配合newLine()实现跨平台换行保证文本格式正确。缓冲区默认大小为 8KB按行读写的方式更贴合文本文件的使用场景。3. 完整代码实现java运行import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /** * 文本文件复制字符缓冲流实现 * 仅支持纯文本文件txt、java、md等处理中文友好 */ public class TextFileCopy { public static void main(String[] args) { // 源文件路径和目标文件路径 String srcPath source.txt; String destPath copy_source.txt; // 使用try-with-resources自动关闭流无需手动处理close() try (BufferedReader br new BufferedReader(new FileReader(srcPath)); BufferedWriter bw new BufferedWriter(new FileWriter(destPath))) { String line; // 按行读取文本readLine()返回null表示文件读取结束 while ((line br.readLine()) ! null) { bw.write(line); // 写入读取到的一行内容 bw.newLine(); // 写入换行符适配不同操作系统 } System.out.println(文本文件复制完成); } catch (IOException e) { System.err.println(文件复制失败 e.getMessage()); e.printStackTrace(); } } }4. 关键细节说明换行处理readLine()读取一行内容时会丢弃换行符因此必须配合bw.newLine()写入换行否则所有文本会合并为一行。异常处理使用try-with-resources语法流会在代码块结束后自动关闭避免资源泄漏这是 Java 7 推荐的方式。编码注意FileReader/FileWriter默认使用平台编码如 GBK如果文件是 UTF-8 编码建议使用InputStreamReader/OutputStreamWriter显式指定编码避免乱码。三、任意文件复制字节缓冲流万能复制1. 适用场景字节缓冲流BufferedInputStream/BufferedOutputStream不区分文件格式支持复制所有类型文件包括文本、图片、视频、压缩包、PDF 等是真正的 “万能复制方案”竞赛中处理未知格式文件的首选。2. 核心原理BufferedInputStream/BufferedOutputStream为字节节点流增加缓冲区减少磁盘 IO 交互提升读写效率。字节流以二进制数据为单位进行读写不会对文件内容做任何处理因此可以完美复制所有文件格式。推荐使用 8KB8192 字节的缓冲区大小平衡内存占用和读写效率。3. 完整代码实现java运行import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /** * 任意文件复制字节缓冲流实现 * 支持所有文件类型文本、图片、视频、压缩包等万能复制方案 */ public class AnyFileCopy { public static void main(String[] args) { // 源文件路径和目标文件路径可修改为任意文件路径 String srcPath source.jpg; String destPath copy_source.jpg; // 缓冲区大小推荐8KB8192字节兼顾效率和内存占用 byte[] buffer new byte[8192]; try (BufferedInputStream bis new BufferedInputStream(new FileInputStream(srcPath)); BufferedOutputStream bos new BufferedOutputStream(new FileOutputStream(destPath))) { int len; // 循环读取文件read()返回-1表示文件读取结束 while ((len bis.read(buffer)) ! -1) { // 写入读取到的有效字节避免写入缓冲区的无效数据 bos.write(buffer, 0, len); } System.out.println(文件复制完成); } catch (IOException e) { System.err.println(文件复制失败 e.getMessage()); e.printStackTrace(); } } }4. 关键细节说明缓冲区写入read(buffer)方法返回的是本次读取到的有效字节数因此写入时必须使用write(buffer, 0, len)避免将缓冲区中未读取的旧数据写入目标文件。效率对比相比单字节读写使用 8KB 缓冲区可以大幅减少磁盘 IO 次数复制大文件时效率提升非常明显。通用性无论文件是文本、图片还是视频只要修改文件路径和后缀都可以使用该代码完成复制无需修改核心逻辑。四、两种方案对比与选择指南表格对比项字符缓冲流BufferedReader/BufferedWriter字节缓冲流BufferedInputStream/BufferedOutputStream适用文件类型仅纯文本文件所有文件类型文本、图片、视频、压缩包等读写方式按行读写处理文本友好按字节数组读写二进制数据无损复制中文处理友好支持文本格式无感知不处理字符编码效率文本文件复制效率高大文件 / 非文本文件复制效率高场景推荐文本文件复制、日志读写、配置文件处理通用文件复制、竞赛未知格式文件处理一句话选择建议只复制文本文件优先用字符缓冲流复制图片、视频等任意文件或不确定文件类型时直接用字节缓冲流它是万能方案。五、常见坑点与避坑指南字符流乱码问题FileReader默认使用平台编码复制 UTF-8 编码的文本文件时建议使用InputStreamReader指定编码java运行BufferedReader br new BufferedReader(new InputStreamReader(new FileInputStream(srcPath), UTF-8)); BufferedWriter bw new BufferedWriter(new OutputStreamWriter(new FileOutputStream(destPath), UTF-8));字节流缓冲区写入错误必须使用write(buffer, 0, len)不能直接write(buffer)否则会写入缓冲区中未读取的无效数据导致目标文件损坏。流资源泄漏一定要使用try-with-resources语法确保流被自动关闭避免文件句柄占用。大文件复制优化复制 GB 级大文件时可适当增大缓冲区大小如 16KB 或 32KB进一步减少磁盘 IO 次数提升效率。六、总结文件复制是 Java IO 编程的基础也是竞赛和面试中的高频考点。本文从最常用的文本文件复制入手对比了字符缓冲流和字节缓冲流两种方案的实现、原理和适用场景你可以根据文件类型和需求选择合适的方案处理文本文件时字符缓冲流的按行读写方式更贴合场景处理中文友好处理任意文件时字节缓冲流的通用性更强是 “万能复制” 的首选。掌握这两种方案你就能轻松应对所有 Java 文件复制的场景需求无论是日常开发还是竞赛题都能得心应手。