Java 文件复制实战:字符缓冲流 vs 字节缓冲流 一、题目要求
一、本次练习来自竞赛题 homework to blog,核心任务如下:
文本文件复制 —— 使用字符缓冲流(BufferedReader / BufferedWriter),这也是处理文本文件最常用的方式。
任意文件复制 —— 使用字节缓冲流(BufferedInputStream / BufferedOutputStream),可以复制图片、视频、压缩包等任何格式,因此称为“万能复制”。
二、代码实现
- 文本文件复制(字符缓冲流)
java
import java.io.*;
public class TextFileCopy {
public static void main(String[] args) {
// 源文件路径和目标文件路径(请根据实际修改)
String source = "source.txt";
String dest = "dest.txt";
// 使用 try-with-resources 自动关闭流(Java 7+)
try (BufferedReader br = new BufferedReader(new FileReader(source));
BufferedWriter bw = new BufferedWriter(new FileWriter(dest))) {
String line;
// 按行读写,效率高且保留换行符
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine(); // 写入对应系统的换行符
}
System.out.println("文本文件复制完成!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
关键点说明:
readLine() 一次读一行,方便处理带换行的文本。
newLine() 会根据操作系统自动写入 \n 或 \r\n,保证可移植性。
字符缓冲流处理文本文件最常用、最安全。
- 任意文件复制(字节缓冲流)
java
import java.io.*;
public class AnyFileCopy {
public static void main(String[] args) {
// 源文件(可以是图片、视频、PDF等)与目标文件
String source = "example.jpg";
String dest = "copy_example.jpg";
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(source));
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);
}
System.out.println("任意文件复制完成!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
关键点说明:
字节流不关心文件内容,原样复制每个字节,因此可以处理任何文件。
使用 byte[] 缓冲区(建议大小 4KB~8KB)批量读写,比单字节循环快得多。
bis.read(buffer) 返回实际读取的字节数,最后一次可能不足缓冲区大小,所以 write(buffer, 0, len) 确保只写入有效部分。
三、运行效果演示
假设当前目录下有 source.txt。
执行 TextFileCopy 后:
生成 dest.txt,内容与源文件完全相同。
执行 AnyFileCopy 后:
控制台输出:
text
文本文件复制完成!
任意文件复制完成!
四、总结
场景 推荐方案
复制文本文件(.txt, .java, .md等) BufferedReader + BufferedWriter
复制任意类型文件(图片、视频、压缩包等) BufferedInputStream + BufferedOutputStream
字符缓冲流处理文本方便,按行读写符合人类阅读习惯。字节缓冲流是万能方案,支持所有文件格式,复制二进制文件必须使用它。
无论哪种,都要使用缓冲流 + 缓冲区数组 来保证效率。快动手试试吧!

浙公网安备 33010602011771号