目录的拷贝

这篇博客详细介绍了如何实现文件及目录的拷贝功能。核心思路包括一个拷贝方法,专门处理文件拷贝操作,以及一个递归方法,用于在目标位置创建目录并递归地复制所有子目录直至遍历完成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.io.*;
/*
    拷贝目录及其文件:
    思路:拷贝需要拷贝源,拷贝目的地,拷贝方法。首要是面向对象,把拷贝方法单独列出来。
          拷贝方法涉及到递归,因为要判断路径表示目录还是文件
 */
public class DirCopy {
    public static void main(String[] args) {
        //这里可以采用用户从控制台输入拷贝源和拷贝目的地
        //拷贝源头
        File copySource=new File("D:\\CopyTest");
        //拷贝目的地
        File copyAim=new File("C:\\");
        //拷贝方法
        copyDir(copySource,copyAim);
  }

    /**
     *
     * @param copySource 拷贝源
     * @param copyAim   拷贝目的地
     */
    private static void copyDir(File copySource, File copyAim) {
        //判断,如果是文件就被必要递归了,并且执行拷贝方法
        if (copySource.isFile()){
            FileInputStream fis=null;
            FileOutputStream fos=null;
            try {
                fis=new FileInputStream(copySource);
                //注意。这里要获取拷贝目的地的路径,需要字符串拼接。获取拷贝目的地参数的绝对路径字符串名,判断是否以斜杠结尾,如果不是添加斜杠。。由于可能涉及改变盘符,所以将拷贝源路径的盘符砍掉,也就是砍掉前三个
                String aim=(copyAim.getAbsolutePath().endsWith("\\")?copyAim.getAbsolutePath():copyAim.getAbsolutePath()+"\\")+copySource.getAbsolutePath().substring(3);
                fos=new FileOutputStream(aim);
                //边读边写
                byte[] bytes=new byte[1024*1024];
                int readNum=0;
                while ((readNum=fis.read())!=-1){
                    fos.write(bytes,0,readNum);
                }
                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=copySource.listFiles();
        //遍历所有子文件和目录
        for (File file:files){
            //由于所有子里面,也可能还含有目录,而这些目录需要在目的地创建出来,因此需要再次判断,是否为目录
            if (file.isDirectory()){
                //获取目录的绝对路径名,并进行字符串拼接操作,因为源头的路径名字需要与目的地的路径名字相同(不包含盘符),,因此这里的操作是改变源头的盘符
                String aim=(copyAim.getAbsolutePath().endsWith("\\")?copyAim.getAbsolutePath():copyAim.getAbsolutePath()+"\\")+file.getAbsolutePath().substring(3);
                //得到目的地绝对路径名后,new出该文件路径,并判判断其是否存在,如果不存在,调用mkdirs方法,创建出其所有子目录,多重创建
                File newFile=new File(aim);
                if (!newFile.exists()){
                    newFile.mkdirs();
                }
            }
            //上面执行结束后,调用递归,重复执行,直到没有目录为止
            copyDir(file,copyAim);
        }
    }
}

代码执行过程都写在了代码旁边。
重要的思路就是:一个拷贝方法,一个递归方法

  1. 拷贝方法:当判断传入的路径表示的是文件的时候,就可以拷贝了,在这里面执行拷贝
  2. 递归方法:当判断不为文件,而为目录时,调用mkdirs()方法多重创建出所有目录,再执行递归方 法,循环执行,直到最终判断不为目录为止
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值