文件复制是 Java IO 高频考点与实操需求,分两类场景:文本文件复制(字符缓冲流 BufferedReader/BufferedWriter)任意格式文件万能复制(字节缓冲流 BufferedInputStream/BufferedOutputStream),缓冲流自带缓冲区,相比原生普通流读写效率大幅提升,是项目首选方案。

一、字符缓冲流:只用于文本文件复制(最常用)

1. 适用范围

仅能复制.txt、.java等纯文本文件,不能复制图片、视频、压缩包,底层基于字符编码,读写字符。

2. 核心 API

BufferedReader (字符输入缓冲)、BufferedWriter (字符输出缓冲),提供readLine()整行读取方法,文本处理极其方便。

3. 代码示例

java

运行

import java.io.*;
public class CharBufferCopy {
    public static void main(String[] args) {
        //源文件、目标文件路径
        String srcPath = "src.txt";
        String destPath = "copy.txt";

        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();
        }
    }
}

特点

  1. readLine()一次性读一行字符串,不用手动定义数组,文本操作简洁;
  2. 自带默认 8192 字符缓冲区,减少磁盘 IO 次数,性能优于 FileReader/FileWriter;
  3. 局限:非文本文件会出现乱码、文件损坏。

二、字节缓冲流:万能复制,支持任意文件(图片 / 视频 / 压缩包 / 文档全兼容)

1. 适用范围

所有格式文件通用,图片 jpg/png、mp4 视频、exe、zip 压缩包、文本全部可以复制,IO 底层以字节为单位,不涉及编码解析。

2. 核心 API

BufferedInputStream、BufferedOutputStream,默认 8192 字节缓冲区。

3. 代码示例

java

运行

import java.io.*;
public class ByteBufferCopy {
    public static void main(String[] args) {
        //可替换图片、视频、压缩包路径
        String src = "test.jpg";
        String dest = "copy.jpg";

        try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest))){

            byte[] buf = new byte[1024]; //自定义缓冲数组
            int len;
            while((len = bis.read(buf)) != -1){
                bos.write(buf,0,len);
            }
            bos.flush(); //刷新缓冲区
            System.out.println("任意文件复制完成");
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

特点

  1. 万能复制,开发中需要通用文件复制优先选用字节缓冲流;
  2. 双层缓冲:自带默认缓冲区 + 自定义 byte 数组,读写速度最优;
  3. 不解析字符编码,不存在乱码问题。

三、两种缓冲流对比总结

  1. 字符缓冲流 (BufferedReader/BufferedWriter) 适用:仅纯文本文件复制,优势:按行读写,文本处理便捷;缺点:无法处理非文本。
  2. 字节缓冲流 (BufferedInputStream/BufferedOutputStream) 适用:全部类型文件万能复制,图片、音视频、压缩包、文本通吃;缺点:不能按行读取文本,只能字节数组读写。

四、开发选型建议

  1. 只操作 txt 等文本 → 字符缓冲流(最常用);
  2. 不确定文件类型 / 图片视频 / 通用复制 → 字节缓冲流(万能首选);
  3. 缓冲流一律使用 try-with-resources 语法 (JDK7+),自动关闭流,不用手动 finally 释放资源。

补充小知识点

缓冲流本质是包装流,不直接对接文件,需要包装原生节点流 (FileInputStream/FileReader);缓冲流关闭时会自动刷新缓冲区,也可手动调用 flush () 强制刷盘。

更多推荐