使用字节输入输出流、File类完成目录的拷贝。(递归完成)

源码

import java.io.*;

/**
 * @author dj
 * @date 2020-07-26
 * 文件目录拷贝
 */
public class DirCopy {
    public static void main(String[] args) {
        // 拷贝源
        File srcFile = new File("G:\\库");
        // 拷贝目的地
        File destFile = new File("G:\\Desktop\\DJ");
        // 将文件从【源】拷贝到【目的地】
        long begin = System.currentTimeMillis();
        copyDir(srcFile, destFile);
        long end = System.currentTimeMillis();
        System.out.println("拷贝成功, 耗时: " + (end - begin) + "(毫秒)");
    }

    /**
     * 拷贝目录
     *
     * @param srcFile  源文件
     * @param destFile 目标文件
     */
    private static void copyDir(File srcFile, File destFile) {
        if (srcFile.isFile()) {
            /*
             子文件是【文件】,递归结束。
             这个时候需要进行文件拷贝
             一边读一边写...
             */
            // 准备好字节输入输出流
            FileInputStream fis = null;
            FileOutputStream fos = null;
            try {
                fis = new FileInputStream(srcFile);
                fos = new FileOutputStream(destFile + "\\" + srcFile.getAbsolutePath().substring(3));

                // 具体的拷贝操作
                // 准备一个byte[]数组作为内存和磁盘之间的缓冲
                byte[] bytes = new byte[1024 * 1024];// 一次拷贝1MB大小的字节
                int readCount = 0;// readCount -- 读取的字节数量
                while ((readCount = fis.read(bytes)) != -1) {
                    // 读多少,写多少
                    fos.write(bytes, 0, readCount);
                }

                // 刷新
                fos.flush();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // 关闭输入流
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                // 关闭输出流
                if (fos != null) {
                    try {
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return;
        }

        // 获取父目录下面的子目录
        File[] files = srcFile.listFiles();
        for (File file : files) {
            // 子文件是【目录】,在目的地新建目录
            if (file.isDirectory()) {
                // 源文件目录 -- 截取后 -- srcFilePath
                String srcFilePath = file.getAbsolutePath().substring(3);
                // 目标文件目录 -- 拼接后 -- destFilePath
                String destFilePath = destFile + "\\" + srcFilePath;
                // 新建File对象
                File newDestFile = new File(destFilePath);
                // 若目标文件目录不存在,则新建目录
                if (!newDestFile.exists()) {
                    newDestFile.mkdirs();
                }
            }
            // 递归调用
            copyDir(file, destFile);
        }
    }
}

结果

分类: Java SE

Deng Jia

Keep Moving.

0 条评论

发表评论

电子邮件地址不会被公开。