1. 文本文件复制:字符缓冲流(最常用)
对于纯文本文件(如 .txt, .java, .html),使用字符缓冲流(BufferedReader / BufferedWriter)是最高效、最不易出现乱码的选择。

核心类: FileReader, FileWriter, BufferedReader, BufferedWriter

核心代码:

import java.io.*;

public class TextCopyDemo {
public static void main(String[] args) {
File source = new File(“source.txt”);
File dest = new File(“dest.txt”);

    // 使用 JDK7 引入的 try-with-resources 自动关闭流
    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();
    }
}

}
2. 任意文件复制:字节缓冲流(万能复制)
对于图片、视频、音频、PDF 等非纯文本的二进制文件,必须使用字节缓冲流(BufferedInputStream / BufferedOutputStream)。因为字符流在读二进制文件时会尝试进行字符编码转换,从而彻底损坏文件。

核心类: FileInputStream, FileOutputStream, BufferedInputStream, BufferedOutputStream

核心代码:

import java.io.*;

public class CopyAnyFileDemo {
public static void main(String[] args) {
File source = new File(“video.mp4”);
File dest = new File(“video_copy.mp4”);

    try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(source));
         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest))) {
        
        // 定义一个 8KB 的缓冲区
        byte[] buffer = new byte[8192];
        int len;
        
        // 循环读取并写入
        while ((len = bis.read(buffer)) != -1) {
            bos.write(buffer, 0, len);
        }
        System.out.println("万能文件复制成功!");
        
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}
3. 为什么一定要用“缓冲流(Buffered)”?
如果不使用缓冲流,Java 每读写一个字符/字节都会直接操作一次磁盘,I/O 性能极差。
而缓冲流在内存中开辟了一个缓冲区(默认 8KB),数据先存入内存,等满了之后再一次性写入磁盘,极大地减少了磁盘 I/O 次数,是竞赛和实际开发中必须掌握的高性能写法。

更多推荐