需求:实现文件夹复制

需求分析:

  1. 复制一个目录中的所有内容到指定目录
  2. 目录中有目录的情况,需要再进入子目录复制子目录的内容,递归调用即可
  3. 给定两个路径File对象,一个为要复制的文件夹,一个为目标路径
  4. 定义复制文件的方法,在复制目录的方法中判断:如果是文件就复制,如果是文件夹就递归调用本方法,再加上异常抛出判断,如:给定的File参数不能为null或目标路径不能是文件
import java.io.*;

public class CopyDir{
    public static void main(String[] args) {
        //要复制的文件路径的File对象
        File copyDir = new File("F:\\下载");
        //目标路径的File对象
        File pasteDir = new File("F:\\io");
        //调用复制文件方法,把参数传进去 (try...catch处理)
        try {
            copyPasteDir(copyDir,pasteDir);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //复制文件夹方法
    private static void copyPasteDir(File copyDir, File pasteDir) throws IOException {
        //异常判断 并在控制台抛出
        if (copyDir == null || pasteDir == null) {
            throw new RuntimeException("参数不能为空!");
        }
        if (pasteDir.isFile()) {
            throw new RuntimeException("目标路径不能是文件!");
        }
        //判断是文件还是目录
        //如果是文件
        if (copyDir.isFile()) {
            //获取要复制的文件名称,在目标路径中创建同名文件
            String name = copyDir.getName();
            File newFile = new File(pasteDir, name);
            //调用复制文件方法,参数为本文件和目标路径新创建的同名文件
            copyPasteFile(copyDir, newFile);
        }
        //如果是目录
        else if (copyDir.isDirectory()) {
            //获取要复制的文件夹名称,在目标路径中创建同名文件夹
            String name = copyDir.getName();
            File newFile = new File(pasteDir, name);
            //如果该文件夹不存在,创建该文件夹
            if (!newFile.exists()) {
                newFile.mkdirs();
            }
            //把本目录的所有文件或文件夹存储到File数组中
            File[] dir = copyDir.listFiles();
            //循环递归调用复制文件夹方法,直到复制完毕所有的File对象
            for (File childDirs : dir) {
                copyPasteDir(childDirs, newFile);
            }
        }
    }

    //复制文件方法
    private static void copyPasteFile(File copyFile, File pasteFile) throws IOException {
        //创建字节数输入流和字节输出流(字符流不可以复制图片视频等)
        FileInputStream fis = new FileInputStream(copyFile);
        FileOutputStream fos = new FileOutputStream(pasteFile);
        //实现文件复制就是循环边读边写的过程
        int data;
        while ((data = fis.read()) != -1) {
            fos.write(data);//边读边写
            fos.flush();//刷新流
        }
        //关闭流
        fis.close();
        fos.close();
    }
}

注意:

  • 只需要把main方法中File对象的路径的更改为自己电脑上的路径即可
  • 复制文件最好用字节流,字符流复制图片视频音乐等文件可能会出现问题
  • 异常最好不要抛给main方法,try…catch处理即可,如果普通方法不想往上抛异常,把普通方法的所有代码块放到try…catch里的第一个大括号里即可

欢迎评论补充~