IO 文件复制:字符缓冲流 字节缓冲流
Java IO 文件复制字符缓冲流 字节缓冲流实战详解前言在 Java IO 开发与算法竞赛编程中文件复制是高频基础考点分为「文本专用的字符缓冲流复制」和「全类型通用的字节缓冲流万能复制」两大类。本文拆解两种实现方式的原理、代码、适用场景帮你彻底分清什么时候用字符流、什么时候用字节流。一、分类总览文本复制用字符缓冲流任意文件全用字节缓冲流二、字符缓冲流实现纯文本文件复制最常用1. 原理说明BufferedReader带缓冲区读取文本readLine()整行读取字符串避免单字符 IO 频繁访问磁盘BufferedWriter整行写出内置 8192 字符缓冲区大幅提升读写效率只支持 txt 等文本不能复制图片 / 音频。2. 完整代码示例java运行import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /** * 字符缓冲流文本文件专属复制 */ public class CharCopyDemo { public static void main(String[] args) { // 源文件待复制文本目标文件复制后文件 String srcPath src/demo.txt; String destPath src/copy.txt; // try-with-resources自动关闭流JDK7特性竞赛推荐写法 try (BufferedReader br new BufferedReader(new FileReader(srcPath)); BufferedWriter bw new BufferedWriter(new FileWriter(destPath))) { String line; // 循环按行读取读到null代表文件末尾 while ((line br.readLine()) ! null) { bw.write(line); bw.newLine(); // 补换行还原原文件换行格式 } System.out.println(文本复制完成); } catch (IOException e) { e.printStackTrace(); } } }3. 优缺点✅ 优点按行读写代码简洁文本处理效率最优开发处理文档首选 ❌ 缺点无法复制非文本png/mp4/exe 等会损坏文件。三、字节缓冲流实现万能任意文件复制1. 原理说明BufferedInputStream、BufferedOutputStream基于字节数组缓冲区读写文件本质都是二进制字节因此图片、视频、压缩包、Office 文档、exe 程序全部通用是跨格式文件复制的万能方案竞赛中需要通用复制优先选字节缓冲流。2. 完整代码示例java运行import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /** * 字节缓冲流任意格式文件万能复制 */ public class ByteCopyDemo { public static void main(String[] args) { // 可替换为图片/视频/压缩包路径 String srcPath src/test.png; String destPath src/copy.png; try (BufferedInputStream bis new BufferedInputStream(new FileInputStream(srcPath)); BufferedOutputStream bos new BufferedOutputStream(new FileOutputStream(destPath))) { // 自定义缓冲区数组一般1024*8字节 byte[] buf new byte[8192]; int len; // 每次实际读取的字节长度 while ((len bis.read(buf)) ! -1) { bos.write(buf, 0, len); } bos.flush(); // 刷新缓冲区把剩余数据写入文件 System.out.println(万能文件复制完成); } catch (IOException e) { e.printStackTrace(); } } }3. 优缺点✅ 优点全文件类型通用二进制无损复制通用性拉满 ❌ 缺点不能直接按行读取文本内容如需解析文本内容还要额外转字符串。四、两种流选型总结面试 / 竞赛考点只复制纯文本.txt/.md 等→ 字符缓冲流BufferedReaderBufferedWriter优势readLine()按行处理文本业务开发解析文档首选。不确定文件格式 / 复制图片视频压缩包 → 字节缓冲流BufferedIn/OutputStream优势万能复制IO 竞赛通用文件复制必用方案。五、拓展IO 优化小技巧使用try-with-resources语法自动关闭 IO 流不用手动close()避免忘记关流导致资源泄漏竞赛代码最简写法缓冲数组推荐8192(8KB)和底层缓冲区大小匹配IO 性能最优字节流写完尽量手动flush()防止缓冲区残留数据丢失。结语文件复制是 Java IO 体系的入门重难点记住「文本字符缓冲全量字节缓冲」一句话选型口诀日常开发和竞赛做题就不会选错流。后续遇到大文件分片复制、断点续传等进阶需求也是基于这两种缓冲流拓展实现。