竞赛题--文本文件复制/任意文件复制
2026/6/10 15:14:08 网站建设 项目流程

homework to blog5

Java IO 四种文件复制方式详解(文本 + 字节缓冲流)

一、IO 流分类说明

  1. 字符流 (Reader/Writer):仅能处理文本文件(.txt/.java 等)

    • 普通字符流:FileReader+FileWriter 文本复制
    • 字符缓冲流:BufferedReader+BufferedWriter,日常文本复制首选,效率最高
  2. 字节流 (InputStream/OutputStream):万能复制,所有格式文件(图片 / 视频 / 压缩包 / 文本全支持)

    • 普通字节流:FileInputStream+FileOutputStream
    • 字节缓冲流:BufferedInputStream+BufferedOutputStream,任意文件万能高效复制

核心结论:文本优先字符缓冲流;不确定文件类型 / 非文本一律用字节缓冲流。

二、代码实现

1. 基础字符流实现文本复制(FileReader/FileWriter)

import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /** * 普通字符流:仅限txt等纯文本复制 */ public class CopyByFileChar { public static void main(String[] args) { // 源文件、目标文件路径 String srcPath = "src/demo.txt"; String destPath = "copy_demo.txt"; FileReader fr = null; FileWriter fw = null; try { fr = new FileReader(srcPath); fw = new FileWriter(destPath); // 单个字符读取 int ch; while ((ch = fr.read()) != -1) { fw.write(ch); } fw.flush(); // 刷新缓冲区 System.out.println("普通字符流复制完成"); } catch (IOException e) { e.printStackTrace(); } finally { // 关闭资源 try { if (fw != null) fw.close(); if (fr != null) fr.close(); } catch (IOException e) { e.printStackTrace(); } } } }

2. 字符缓冲流(BufferedReader/BufferedWriter,日常最常用文本复制)

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /** * 字符缓冲流:文本文件最优方案,按行读写效率极高 */ public class CopyByBufferedChar { public static void main(String[] args) { String src = "src/demo.txt"; String dest = "buf_copy.txt"; BufferedReader br = null; BufferedWriter bw = null; try { br = new BufferedReader(new FileReader(src)); bw = new BufferedWriter(new FileWriter(dest)); String line; // readLine()读取一行,null代表读到末尾 while ((line = br.readLine()) != null) { bw.write(line); bw.newLine(); // 换行,还原原文件换行格式 } bw.flush(); System.out.println("字符缓冲流复制成功"); } catch (IOException e) { e.printStackTrace(); } finally { try { if (bw != null) bw.close(); if (br != null) br.close(); } catch (IOException e) { e.printStackTrace(); } } } }

3. 基础字节流实现任意文件复制(FileInputStream/FileOutputStream)

import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /** * 普通字节流:全类型文件可用,但无缓冲,大文件效率差 */ public class CopyByFileByte { public static void main(String[] args) { // 可替换为图片/mp4/zip任意文件 String src = "test.jpg"; String dest = "copy_test.jpg"; FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(src); fos = new FileOutputStream(dest); byte[] buf = new byte[1024]; // 自定义字节数组缓冲区 int len; while ((len = fis.read(buf)) != -1) { fos.write(buf,0,len); } fos.flush(); System.out.println("普通字节流复制完成"); } catch (IOException e) { e.printStackTrace(); } finally { try { if(fos!=null) fos.close(); if(fis!=null) fis.close(); } catch (IOException e) { e.printStackTrace(); } } } }

4. 字节缓冲流(BufferedInputStream/BufferedOutputStream,万能全格式复制)

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /** * 字节缓冲流:万能复制,图片、视频、压缩包、文本全部兼容,竞赛首选 */ public class CopyByBufferedByte { public static void main(String[] args) { String src = "source.mp4"; String dest = "copy_source.mp4"; BufferedInputStream bis = null; BufferedOutputStream bos = null; try { bis = new BufferedInputStream(new FileInputStream(src)); bos = new BufferedOutputStream(new FileOutputStream(dest)); byte[] buffer = new byte[8192]; // 缓冲数组,默认缓冲流内置8192字节缓冲区 int length; while ((length = bis.read(buffer)) != -1) { bos.write(buffer, 0, length); } bos.flush(); System.out.println("字节缓冲流万能复制成功"); } catch (IOException e) { e.printStackTrace(); } finally { // 缓冲流关闭会自动关闭底层节点流 try { if (bos != null) bos.close(); if (bis != null) bis.close(); } catch (IOException e) { e.printStackTrace(); } } } }

三、总结

  1. 区分字符流、字节流核心规则:能使用记事本正常打开查看内容(txt、java 源码)→字符流;图片、视频、压缩包、exe 等二进制文件→字节流,字符流不可复制二进制文件,会出现文件损坏、乱码失效。
  2. 基础流与缓冲流区别:普通节点流(FileReader/FileWriter、FileInputStream/FileOutputStream)无内置缓冲区,单字符 / 单字节读写效率极低,仅用来理解底层原理;缓冲流(Buffered 包装类)自带 8192 默认缓冲区,减少磁盘 IO 次数,项目、考试首选
  3. 四种方案选用口诀
    • 纯文本小练习:基础字符流(FileReader+FileWriter)
    • 日常文本复制:字符缓冲流(BufferedReader+BufferedWriter,readLine 整行读写)
    • 任意文件简易复制:普通字节流 + 自定义 byte 数组
    • 万能通用复制:字节缓冲流(全格式通用,考试最优解)
  4. 通用代码规范:所有 IO 操作必须捕获 IO 异常,finally 中关闭流资源;缓冲流操作结束建议执行flush()刷新缓冲区,防止数据滞留内存未落地磁盘。

四、解题思路

1. 审题第一步:判断文件类型

1.题目要求只复制文本:优先选用字符相关流,追求效率选BufferedReader+BufferedWriter;初学演示用 FileReader+FileWriter。

2.题目要求复制图片 / 视频 / 所有类型文件:一律选用字节流,最优BufferedInputStream+BufferedOutputStream,禁止使用字符流。

2. 代码固定编写步骤(万能步骤)

1.定义源文件路径、目标文件路径;

2.声明流对象,初始值 null;

3.try 中创建输入、输出流实例;

4.定义缓冲区(char 数组 /byte 数组,或直接 readLine),循环读取,read () 返回 - 1、readLine 返回 null 代表文件末尾,结束循环

5.读取多少写入多少:write(数组,0,实际读取长度len),避免写出多余脏数据;

6.flush 刷新缓冲区;

7.finally 非空判断,逐个关闭输出流、输入流(先关输出,再关输入)。

3. 考试避坑要点

1.字符缓冲流readLine()会自动舍弃换行符,写入时必须搭配bw.newLine()补换行,否则文档所有内容挤成一行;

2.字节流必须用len接收 read 返回值,不能直接固定数组长度写入;

3.路径写错、文件不存在会抛出 IOException,必须异常捕获,不能省略 try-catch。

五、心得体会

  1. 通过四种复制代码对比,彻底理清字符流面向字符编码、字节流面向原始二进制的底层差异,纠正了 “所有文件都能用字符流复制” 的误区,明白了二进制文件用字符流复制损坏的根本原因是编码解析破坏原始字节数据。

  2. 缓冲区是 IO 提速关键:基础流频繁访问磁盘导致效率差,缓冲流批量读写、减少磁盘交互,实际开发中几乎不会使用单字节读写的原生基础流写法,缓冲流是工程标准写法。

  3. IO 编程规范养成:IO 属于资源型操作,打开的文件流占用操作系统资源,忘记关闭流会造成资源泄漏,所以养成 finally 关闭流、必要时 flush 刷新的编码习惯。

  4. 应试收获:总结出固定做题模板,以后遇到文件复制题目,先分文件类型再套代码结构,不用临时构思逻辑,提升做题准确率与速度。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询