JAVA进阶之IO流——目录的拷贝

思路解析

  1. 目录的拷贝要获取源目录和拷贝目录。
public static void main(String[] arg){
	//源目录
	File srcFile = new File("D:\\a\\b");
	//拷贝目录(目标目录)
	File destFile = new File("C:\\c\\d");
	//递归调用
	copy(srcFile,destFile);
}
  1. 采用递归法进行拷贝,递归结束的条件是,当srcFile是文件而不是目录时,结束递归
public static void copy(File srcFile,File destFile){
	if(srcFile.isFile())
		return;
}
  1. 一个目录下可能会有多个子目录,所有我们要获取这些子目录,并进行递归。
public static void copy(File srcFile,File destFile){
	if(srcFile.isFile())
		return;
	File[] files = srcFile.listFiles();
	for(File file:files){
		copy(file,destFile);
	}
}
  1. 写到这步时,我们可以写一个输出语句,来判断递归算法是否正确。
public static void copy(File srcFile,File destFile){
	if(srcFile.isFile())
  		return;
 	File[] files = srcFile.listFiles();
 	for(File file:files){
 		System.out.println(srcFile.getPath());
  		copy(file,destFile);
 	}
}

如果输出的字符串是你源目录的路径信息,此时,这个递归调用是可以使用的;

  1. 创建空的文件和目录
public static void copy(File srcFile,File destFile){
	if(srcFile.isFile())
   		return;
  	File[] files = srcFile.listFiles();
 	for(File file:files){
 		//源目录:"C:\\a",当字符串进行拼接时,只要截取C:/a,'a'后面的字符
 		String srcPath = srcFile.getAbsolutePath();
 		//获取目标目录时,需要考虑字符串的最后是不是“\\”结尾
 		//比如说"D:\\"和"D:\\a\\b",所以这里要进行一个判断
 		String destPath = (destFile.getAbsolutePath().endsWith("\\")? destFile.getAbsolutePath():destFile.getAbsolutePath() + "\\" ) + scrPath.substring(3);
   		//System.out.println(srcFile.getPath());
   		//创建新文件,在目标目录下
   		File copyFile = new File(destPath);
   		//判断这个文件是否存在
   		if(!copyFile.exists()){
			copyFile.mkdirs();
		}
    		copy(file,destFile);
  	}
}
  1. 因为File类,可以封装文件夹,也可以封装文件,所以,当递归条件结束时,即可进行文件信息的输入与输出
public static void copy(File srcFile,File destFile){
    //判断srcFile是文件的话就结束递归
    if(srcFile.isFile()){
        FileInputStream inputStream = null;
        FileOutputStream outputStream = null;
        try {
            inputStream = new FileInputStream(srcFile);
            outputStream = new FileOutputStream((destFile.getAbsolutePath().endsWith("\\")? destFile.getAbsolutePath():destFile.getAbsolutePath() + "\\" ) + srcFile.getAbsolutePath().substring(3));

            //边读边写
            byte[] bytes = new byte[1024 * 1024];
            int readerCount = 0;
            while((readerCount = inputStream.read(bytes))!=-1){
                outputStream.write(bytes,0,readerCount);
            }
            //刷新
            outputStream.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return;
    }
    //获取源文件的子目录
    File[] files = srcFile.listFiles();
    for(File file : files){
        //创建文件目录
        //在拷贝源创建目录
        String scrPath = srcFile.getPath();
        String destPath = (destFile.getAbsolutePath().endsWith("\\")? destFile.getAbsolutePath():destFile.getAbsolutePath() + "\\" ) + scrPath.substring(3);
        File newFile = new File(destPath);
        if(!newFile.exists()){
            newFile.mkdirs();
        }
        //递归调用
        copy(file,destFile);
    }
}

总结:完整的代码为1和6,中间部分为详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值