拷贝文件API && 工具类

一、传统 IO 流拷贝

通过 InputStream 和 OutputStream 手动读写字节,适合需要中间处理(如过滤数据)的场景,但代码较繁琐。

核心步骤
  1. 创建文件输入流(FileInputStream)和输出流(FileOutputStream)。
  2. 定义缓冲区(byte[]),循环读取源文件数据并写入目标文件。
  3. 关闭流
public class StreamCopy {
    public static void main(String[] args) {
        try (InputStream in = new FileInputStream("source.txt");
             OutputStream out = new FileOutputStream("target.txt")) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
            System.out.println("文件拷贝成功");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

二 . commons.io

        org.apache.commons.io.FileUtils 是 Apache Commons IO 工具库提供的工具类封装了丰富的文件操作方法,包括便捷的文件拷贝功能,能极大简化传统 IO 流的繁琐代码,是实际开发中常用的工具。 

FileUtils 的核心拷贝 API

方法签名功能描述
copyFile(File srcFile, File destFile)拷贝单个文件,若目标文件存在会抛出异常
copyFile(File srcFile, File destFile, boolean preserveFileDate)拷贝文件时可选择是否保留源文件的修改时间

copyDirectory(File srcDir, File destDir)

copyDirectoryToDirectory(File srcDir, File destDir) 

核心区别在于 目标路径的处理方式 不同
copyInputStreamToFile(InputStream src, File destFile)将输入流内容写入文件
deleteDirectory(File dir)递归删除整个目录(含内容),目录本身也会被删除
cleanDirectory(File dir)清空目录内容(保留空目录本身),删除所有子文件、子目录
readFileToString(File file, Charset encoding)按指定编码读取文件内容为字符串,适合小文件(大文件慎用,易内存溢出)
write(File file, CharSequence data, String encoding)按指定编码向文件写入内容(覆盖原内容,需确保父目录存在)
*//*
  FileUtils类
        static void copyFile(File srcFile, File destFile)                   复制文件
        static void copyDirectory(File srcDir, File destDir)                复制文件夹
        static void copyDirectoryToDirectory(File srcDir, File destDir)     复制文件夹

        static void deleteDirectory(File directory)                         删除文件夹
        static void cleanDirectory(File directory)                          清空文件夹
        static String readFileToString(File file, Charset encoding)         读取文件中的数据变成成字符串
        static void write(File file, CharSequence data, String encoding)    写出数据
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;

public class FileUtilsDemo {
    public static void main(String[] args) {
        File source = new File("source.txt");
        File target = new File("target.txt");
        try {
            // 拷贝文件,自动处理流的关闭
            FileUtils.copyFile(source, target);
            System.out.println("拷贝成功");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 IOUtils 类(流操作)

方法签名(简化)功能说明
copy(InputStream in, OutputStream out)拷贝输入流到输出流(自动处理缓冲区,高效且无需手动关流),返回拷贝的字节数
copyLarge(Reader in, Writer out)类似 copy,但针对大文件 / 流(如超过 2GB)优化,返回拷贝的字符数
readLines(Reader in)按行读取流内容,返回 List<String>,适合文本文件逐行处理
write(String data, OutputStream out)直接将字符串写入输出流(自动处理编码为 UTF-8,无需手动转字节)
   IOUtils类
       public static int copy(InputStream input, OutputStream output)      复制文件
       public static int copyLarge(Reader input, Writer output)            复制大文件
       public static String readLines(Reader input)                        读取数据
       public static void write(String data, OutputStream output)          写出数据
*/

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.List;

public class CommonsIODemo1 {
    public static void main(String[] args) {
        // 【场景 6:文件读/写(字符串操作)】
        fileReadWriteDemo();

        // 【场景 7:流拷贝(大文件/自定义流)】
        streamCopyDemo();
    }

   

    // 6. 文件读写(字符串方式,适合小文件)
    public static void fileReadWriteDemo() {
        File file = new File("myio/content.txt");
        try {
            // 写入内容(覆盖原文件)
            FileUtils.write(file, "Hello Commons IO!\n", StandardCharsets.UTF_8);
            // 追加内容(第二个参数设为 true 表示追加)
            FileUtils.write(file, "这是追加的内容~", StandardCharsets.UTF_8, true);

            // 读取文件为字符串
            String content = FileUtils.readFileToString(file, StandardCharsets.UTF_8);
            System.out.println("文件内容:\n" + content);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 7. 流拷贝(自定义输入输出流场景,如网络流、带业务逻辑的流)
    public static void streamCopyDemo() {
        // 模拟:从文件读(InputStream),写入另一个文件(OutputStream)
        try (InputStream in = new FileInputStream("myio/source.txt");
             OutputStream out = new FileOutputStream("myio/target.txt")) {

            // 拷贝流(自动处理缓冲区,高效且无需手动关流)
            int copiedBytes = IOUtils.copy(in, out);
            System.out.println("流拷贝完成,拷贝字节数:" + copiedBytes);

            // 额外演示:按行读取流内容(适合文本处理)
            try (Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) {
                List<String> lines = IOUtils.readLines(reader);
                System.out.println("流内容按行读取:");
                for (String line : lines) {
                    System.out.println(line);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值