递归复制多级文件夹

  • 需求:复制多级文件夹
    • 数据源:E:/Shadowsocks-win-2.5.2/test2
    • 目的地:E:
    • 将该多级文件夹整个复制到e盘根目录
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/*思路:
 *       复制多级文件夹的流程:
 *      A:封装数据源File
 *      B:封装目的地File
 *      C:判断该File是文件夹还是文件
 *          a:是文件夹
 *              就在目的地目录下创建该文件夹
 *              获取该File对象下的所有文件或者文件夹File对象
 *              遍历得到每一个File对象
 *              回到C(递归调用)
 *          b:是文件
 *              就复制(字节流) 可以写一个函数来完成复制功能 */

/**
 * @author Administrator
 *
 */
public class Java_2
{

    public static void main(String[] args)
    {
        // 创建指向源文件和目标文件夹的实例
        File file = new File("E:\\Shadowsocks-win-2.5.2\\test2");
        File file2 = new File("E:");
        findFiles(file, file2);
    }


    /**
     * 判断多级文件夹文件并复制的方法
     * @param file
     * @param file2
     */
    public static void findFiles(File file, File file2)
    {
        if (file.exists())
        {
            if (file.isFile())
            {// 是文件的话直接复制到目标文件夹内,并打印文件路径
                copyFiles(file, file2);
                System.out.println(file.getAbsolutePath() + "已创建");
            }
            else if (file.isDirectory())
            {// 是文件夹的话创建指向新目录的文件实例,调用mkdirs创建多级文件夹
                File file5 = new File(file2.getAbsolutePath() + "\\"
                        + file.getName());
                file5.mkdirs();

                // 接收此文件夹下所有文件目录 实例
                File[] file3 = file.listFiles();

                // 递归出口
                if (file3 == null)
                {
                    return;
                }
                // 遍历文件,递归,循环判断
                for (File file4 : file3)
                {
                    findFiles(file4, file5);
                    System.out.println(file5.getAbsolutePath() + "已创建");
                }
            }
        }
        else
        {
            return;
        }
    }


    /**
     * 把file的内容复制到file2的方法
     * @param file
     * @param file2
     */
    public static void copyFiles(File file, File file2)
    {
        FileInputStream fis;
        FileOutputStream fos;

        // 包装流 带缓冲区
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;

        try
        {
            fis = new FileInputStream(file);
            fos = new FileOutputStream(file2.getAbsolutePath() + "\\"
                    + file.getName());
            bis = new BufferedInputStream(fis);
            // 构造10M的缓冲区
            bos = new BufferedOutputStream(fos, 10 * 1024 * 1024);

            // 文件格式多样,用字节流逐块接收
            byte[] bytes = new byte[1024];
            int len = 0;

            // 记录复制时间 逐块读取到内存并写出到新文本
            long start = System.currentTimeMillis();

            while ((len = bis.read(bytes, 0, 1024)) != -1)
            {
                bos.write(bytes, 0, len);
            }

            long end = System.currentTimeMillis();

            System.out.println("复制" + file.getName() + "花费时间" + (end - start)
                    + "ms");

        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (bis != null)
            {
                try
                {//关闭流
                    bis.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }

            if (bos != null)
            {
                try
                {
                    bos.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
}

输出结果:

复制RAR 压缩文件.rar  花费时间0ms
E:\Shadowsocks-win-2.5.2\test2\RAR 压缩文件.rar已创建
E:\test2已创建
复制新建文本文档.avi  花费时间0ms
E:\Shadowsocks-win-2.5.2\test2\tstst\新建文本文档.avi已创建
E:\test2\tstst已创建
复制肖4配套视频.flv  花费时间1330ms
E:\Shadowsocks-win-2.5.2\test2\tstst\肖4配套视频.flv已创建
E:\test2\tstst已创建
复制酬勤考资全自动播放器.exe  花费时间33ms
E:\Shadowsocks-win-2.5.2\test2\tstst\酬勤考资全自动播放器.exe已创建
E:\test2\tstst已创建
E:\test2已创建
复制新建位图图像.bmp  花费时间0ms
E:\Shadowsocks-win-2.5.2\test2\新建位图图像.bmp已创建
E:\test2已创建
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值