Java IO 缓冲流文件复制竞赛题实践
一、前言
本文为 Java IO 流课程竞赛作业,围绕文件复制功能实现两类方案:字符缓冲流(仅适用于文本文件)、字节缓冲流(万能,支持任意文件)。对比两种流的适用场景、读写效率与代码实现,掌握缓冲流提升 IO 性能的核心原理,同时规范资源关闭写法。
二、知识点区分:字符流 vs 字节流
1. 字符缓冲流 BufferedReader / BufferedWriter
适用:仅纯文本文件(txt、md、java 等),不能复制图片、视频、exe 等二进制文件
核心优势:自带字符缓冲数组,提供readLine()按行读取文本,操作文本代码更简洁
底层:基于字符编码转换,只能处理字符数据
2. 字节缓冲流 BufferedInputStream / BufferedOutputStream
适用:万能复制,支持所有类型文件(文本、图片、视频、压缩包、程序等二进制文件)
核心优势:内置字节缓冲区,减少磁盘 IO 访问次数,读写速度远高于基础字节流
底层:直接操作原始字节,不做编码转换,兼容全部文件格式
三、方案 1:字符缓冲流实现文本文件复制
package com.javablog;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class TextCopy {
public static void main(String[] args) {
// 源文本文件路径、目标复制文件路径
String srcPath = "source.txt";
String destPath = "copy_text.txt";
// try-with-resources 自动关闭流,无需手动close
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();
}
}
}
适用限制
仅能复制.txt等纯文本,复制图片、视频会直接损坏文件,丢失二进制数据。
提示
提前新建文本文件source.txt,放在项目根文件夹内。
四、方案 2:字节缓冲流实现任意文件万能复制
package com.javablog;
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 = "test.jpg";
String destPath = "copy_all.jpg";
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcPath));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destPath))) {
// 自定义缓冲区数组,提升读写效率
byte[] buffer = new byte[1024 * 8];
int len;
// 循环读取字节数组,写入目标文件
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
// 刷新缓冲区,强制写入剩余数据
bos.flush();
System.out.println("任意文件复制完成(字节缓冲流万能方案)");
} catch (IOException e) {
e.printStackTrace();
}
}
}
提示
提前准备test.jpg(例),放在项目根文件夹内。
核心优势
无文件类型限制,图片、视频、音频、程序、压缩包均可完整无损复制,是开发中文件复制通用标准写法。
五、实现思路与性能说明
1.缓冲流优化原理
基础 FileReader/FileInputStream 每次读写都直接访问磁盘,IO 开销极大;缓冲流内置内存数组,批量读写磁盘,大幅减少磁盘交互次数,复制大文件速度提升数十倍。
2.资源释放规范
代码使用try-with-resources语法,实现AutoCloseable接口的流会在代码块结束后自动关闭,避免忘记关闭流导致文件占用、内存泄漏。
3.两者选择标准
只操作纯文本、需要按行读取:选用字符缓冲流
通用文件复制、二进制媒体文件:固定使用字节缓冲流
六、运行结果示例
1.文本复制输出

2.图片 / 视频等任意文件复制输出

七、总结
字符缓冲流BufferedReader/BufferedWriter是文本处理最常用方案,支持按行操作,但仅局限于文本文件;
字节缓冲流BufferedInputStream/BufferedOutputStream为万能复制方案,兼容全部文件类型,竞赛、项目通用首选;
缓冲流通过内存缓冲区降低磁盘 IO 损耗,相比基础流性能优势明显;try-with-resources是 Java7 推荐的安全关闭流写法;
开发文件复制功能时,优先选用字节缓冲流,可避免区分文件类型带来的兼容性问题。
更多推荐

所有评论(0)