当前位置: 首页 > news >正文

Java IO 流文件复制全解:字符缓冲流 vs 字节缓冲流

一、需求场景解析

本次竞赛题的核心是两种文件复制场景:

文本文件复制:专门处理 .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 或 4KB)
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);
}

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. 缓冲区大小怎么选?

常用大小为 4KB(4096)或 8KB(8192),和磁盘扇区大小匹配,能最大化读写效率。过大的缓冲区会占用过多内存,过小则起不到优化效果。

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 编程的规范写法,能避免资源泄漏。
http://www.jsqmd.com/news/984946/

相关文章:

  • 2026 三明厨卫屋面地下室漏水瓷砖空鼓测评:吉修匠 99.8 分五星榜首 - 吉修匠
  • 【JAVA毕设源码分享】基于springboot+vue的教师调停课管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 盒马鲜生购物卡回收新玩法,轻松变废为宝! - 团团收购物卡回收
  • 【信息科学与工程学】【物理/化学科学和工程技术】第八篇 光学07
  • IGBT全桥逆变电路基础知识及Multisim电路仿真
  • Java程序设计(第3版)第四章——继承的调用
  • 2026年装修设计机构推荐榜:这10家方案最实用 - 速递信息
  • 西安市2026年黄金回收+白银回收+铂金回收+彩金回收品牌门店推荐及联系方式+地址+电话+靠谱店铺指南 - 盛世金银回收
  • 对RDMA理解(2)
  • SQL/NoSQL数据库为何成为TVA的记忆系统(10)
  • Java Programming Chapter 4——Inherited call
  • 学习内容梳理_各个行业中对AI的应用_以及投入价值比分析_ai测试工程师---AI大模型系统从零开始0002
  • 京东商品详情页采集API、淘宝1688API
  • 论文精读:喀斯特山地流域耕地流转的时空演变与地形梯度效应——以贵州南北盘江流域为例
  • 从「天翼云盘助手 3.0」到 FusionCloud:我把所有网盘都挂成了本地磁盘
  • 新手适合哪个去水印小程序?我实际试了一圈后的推荐
  • 大连理工大学考研辅导班正规机构,全维度榜单推荐 - 推荐评测师
  • 永辉超市购物卡回收变现最快方式?实测分享靠谱平台 - 团团收购物卡回收
  • HAMi 源码阅读笔记 01:HAMi调度简介
  • 石家庄市2026年黄金回收+白银回收+铂金回收+彩金回收门店TOP排行榜+推荐及联系方式+地址+电话+靠谱店铺指南 - 大熊猫898989
  • 金融行业常用哪些数据分析模型?风控、授信、客户分层框架汇总
  • 基础知识(从零开始学C语言)
  • Claude Code VS Code 插件免登录修复方案(第三方 API 可用)
  • Three.js + 高德地图 WebGL 上下文丢失排查:Context Lost/Restored 完整解决方案
  • Linux------特殊进程
  • 有关磁盘操作
  • 拉罗替尼的上市:2018年FDA获批2022年中国上市,双剂型覆盖全人群
  • 重庆黄金回收全攻略 多家实体门店横向评测附避坑指南 - 余生黄金回收
  • Tcl语言:file命令的使用方式
  • SolonCode(编码智能体)支持鸿蒙 PC