一、需求场景解析本次竞赛题的核心是两种文件复制场景文本文件复制专门处理 .txt/.java 等文本文件推荐使用字符缓冲流任意文件复制支持图片、视频、压缩包等所有类型文件推荐使用字节缓冲流二、文本文件复制字符缓冲流BufferedReader/BufferedWriter字符缓冲流是处理文本文件的首选自带缓冲区读写效率极高还支持按行读取的便捷操作核心代码import java.io.*;public class TextFileCopy {public static void main(String[] args) {// 源文件路径String srcPath src/original.txt;// 目标文件路径String destPath src/copy.txt;// try-with-resources 自动关闭流避免资源泄漏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()bw.newLine();}System.out.println(文本文件复制完成);} catch (IOException e) {e.printStackTrace();}}}关键知识点 BufferedReader.readLine()按行读取文本自动处理换行符适合文本文件场景 BufferedWriter.newLine()写入系统默认的换行符跨平台兼容性更好 适用场景纯文本文件.txt、.java、.html 等不适合处理图片、视频等二进制文件三、任意文件复制字节缓冲流BufferedInputStream/BufferedOutputStream字节流是 “万能流”可以处理所有类型的文件加上缓冲流后效率大幅提升是文件复制的通用方案。核心代码实现import java.io.*;public class AnyFileCopy {public static void main(String[] args) {// 源文件路径支持图片、视频、压缩包等String srcPath src/original.jpg;// 目标文件路径String destPath src/copy.jpg;// 定义缓冲区大小常用 8KB 或 4KBbyte[] buffer new byte[8192];try (BufferedInputStream bis new BufferedInputStream(new FileInputStream(srcPath));BufferedOutputStream bos new BufferedOutputStream(new FileOutputStream(destPath))) {int len;// 循环读取文件数据到缓冲区while ((len bis.read(buffer)) ! -1) {// 将缓冲区的数据写入目标文件bos.write(buffer, 0, len);}System.out.println(文件复制完成);} catch (IOException e) {e.printStackTrace();}}}关键知识点字节流的本质直接操作文件的二进制数据不关心文件格式因此支持所有类型文件缓冲区优化byte[] buffer减少了磁盘 IO 次数大幅提升复制效率bis.read(buffer)返回实际读取到的字节数len -1表示文件读取完毕bos.write(buffer, 0, len)写入时只写实际读取到的字节避免缓冲区残留数据导致文件损坏四、两种方案对比对比项字符缓冲流BufferedReader/BufferedWriter字节缓冲流BufferedInputStream/BufferedOutputStream适用文件类型仅文本文件所有类型文件文本、图片、视频、压缩包等处理单位字符char字节byte核心优势按行读取文本操作便捷效率高通用性强二进制文件无乱码问题典型场景复制日志、配置文件、代码文件复制图片、视频、安装包等任意文件乱码风险处理非文本文件会乱码无乱码风险五、竞赛题常见考点与优化技巧1. 为什么要用缓冲流直接使用FileInputStream/FileOutputStream每次读写都要访问磁盘效率极低缓冲流会先将数据读到内存缓冲区批量读写减少磁盘 IO 次数性能提升非常明显。2. 缓冲区大小怎么选常用大小为 4KB4096或 8KB8192和磁盘扇区大小匹配能最大化读写效率。过大的缓冲区会占用过多内存过小则起不到优化效果。3. try-with-resources 的重要性必须使用 try-with-resources 语法自动关闭流避免手动close()时出现异常导致资源泄漏这也是 Java IO 编程的规范写法。4. 文本文件复制的换行问题使用readLine()读取时会自动去掉换行符因此写入时必须调用newLine()补充换行符否则复制后的文件会变成一行。六、完整工具类封装可以把两种复制方式封装成通用工具类直接调用即可import java.io.*;public class FileCopyUtils {// 文本文件复制字符缓冲流public static void copyTextFile(String srcPath, String destPath) throws IOException {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();}}}// 任意文件复制字节缓冲流public static void copyAnyFile(String srcPath, String destPath) throws IOException {byte[] buffer new byte[8192];try (BufferedInputStream bis new BufferedInputStream(new FileInputStream(srcPath));BufferedOutputStream bos new BufferedOutputStream(new FileOutputStream(destPath))) {int len;while ((len bis.read(buffer)) ! -1) {bos.write(buffer, 0, len);}}}// 测试public static void main(String[] args) throws IOException {// 复制文本文件copyTextFile(src/original.txt, src/copy_text.txt);// 复制图片文件copyAnyFile(src/original.jpg, src/copy_image.jpg);}}七、总结文本文件复制优先用字符缓冲流便捷高效任意文件复制必须用字节缓冲流通用性强缓冲流是 Java IO 性能优化的关键必须掌握try-with-resources 是 Java IO 编程的规范写法能避免资源泄漏。
Java IO 流文件复制全解:字符缓冲流 vs 字节缓冲流
发布时间:2026/6/10 9:38:52
一、需求场景解析本次竞赛题的核心是两种文件复制场景文本文件复制专门处理 .txt/.java 等文本文件推荐使用字符缓冲流任意文件复制支持图片、视频、压缩包等所有类型文件推荐使用字节缓冲流二、文本文件复制字符缓冲流BufferedReader/BufferedWriter字符缓冲流是处理文本文件的首选自带缓冲区读写效率极高还支持按行读取的便捷操作核心代码import java.io.*;public class TextFileCopy {public static void main(String[] args) {// 源文件路径String srcPath src/original.txt;// 目标文件路径String destPath src/copy.txt;// try-with-resources 自动关闭流避免资源泄漏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()bw.newLine();}System.out.println(文本文件复制完成);} catch (IOException e) {e.printStackTrace();}}}关键知识点 BufferedReader.readLine()按行读取文本自动处理换行符适合文本文件场景 BufferedWriter.newLine()写入系统默认的换行符跨平台兼容性更好 适用场景纯文本文件.txt、.java、.html 等不适合处理图片、视频等二进制文件三、任意文件复制字节缓冲流BufferedInputStream/BufferedOutputStream字节流是 “万能流”可以处理所有类型的文件加上缓冲流后效率大幅提升是文件复制的通用方案。核心代码实现import java.io.*;public class AnyFileCopy {public static void main(String[] args) {// 源文件路径支持图片、视频、压缩包等String srcPath src/original.jpg;// 目标文件路径String destPath src/copy.jpg;// 定义缓冲区大小常用 8KB 或 4KBbyte[] buffer new byte[8192];try (BufferedInputStream bis new BufferedInputStream(new FileInputStream(srcPath));BufferedOutputStream bos new BufferedOutputStream(new FileOutputStream(destPath))) {int len;// 循环读取文件数据到缓冲区while ((len bis.read(buffer)) ! -1) {// 将缓冲区的数据写入目标文件bos.write(buffer, 0, len);}System.out.println(文件复制完成);} catch (IOException e) {e.printStackTrace();}}}关键知识点字节流的本质直接操作文件的二进制数据不关心文件格式因此支持所有类型文件缓冲区优化byte[] buffer减少了磁盘 IO 次数大幅提升复制效率bis.read(buffer)返回实际读取到的字节数len -1表示文件读取完毕bos.write(buffer, 0, len)写入时只写实际读取到的字节避免缓冲区残留数据导致文件损坏四、两种方案对比对比项字符缓冲流BufferedReader/BufferedWriter字节缓冲流BufferedInputStream/BufferedOutputStream适用文件类型仅文本文件所有类型文件文本、图片、视频、压缩包等处理单位字符char字节byte核心优势按行读取文本操作便捷效率高通用性强二进制文件无乱码问题典型场景复制日志、配置文件、代码文件复制图片、视频、安装包等任意文件乱码风险处理非文本文件会乱码无乱码风险五、竞赛题常见考点与优化技巧1. 为什么要用缓冲流直接使用FileInputStream/FileOutputStream每次读写都要访问磁盘效率极低缓冲流会先将数据读到内存缓冲区批量读写减少磁盘 IO 次数性能提升非常明显。2. 缓冲区大小怎么选常用大小为 4KB4096或 8KB8192和磁盘扇区大小匹配能最大化读写效率。过大的缓冲区会占用过多内存过小则起不到优化效果。3. try-with-resources 的重要性必须使用 try-with-resources 语法自动关闭流避免手动close()时出现异常导致资源泄漏这也是 Java IO 编程的规范写法。4. 文本文件复制的换行问题使用readLine()读取时会自动去掉换行符因此写入时必须调用newLine()补充换行符否则复制后的文件会变成一行。六、完整工具类封装可以把两种复制方式封装成通用工具类直接调用即可import java.io.*;public class FileCopyUtils {// 文本文件复制字符缓冲流public static void copyTextFile(String srcPath, String destPath) throws IOException {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();}}}// 任意文件复制字节缓冲流public static void copyAnyFile(String srcPath, String destPath) throws IOException {byte[] buffer new byte[8192];try (BufferedInputStream bis new BufferedInputStream(new FileInputStream(srcPath));BufferedOutputStream bos new BufferedOutputStream(new FileOutputStream(destPath))) {int len;while ((len bis.read(buffer)) ! -1) {bos.write(buffer, 0, len);}}}// 测试public static void main(String[] args) throws IOException {// 复制文本文件copyTextFile(src/original.txt, src/copy_text.txt);// 复制图片文件copyAnyFile(src/original.jpg, src/copy_image.jpg);}}七、总结文本文件复制优先用字符缓冲流便捷高效任意文件复制必须用字节缓冲流通用性强缓冲流是 Java IO 性能优化的关键必须掌握try-with-resources 是 Java IO 编程的规范写法能避免资源泄漏。