用Java实现目录复制(包含此目录下的所有文件与目录)

该博客详细介绍了如何使用Java编程实现将一个目录及其子目录、文件完整复制到指定路径的过程。通过递归方法,检查目标目录是否存在并创建,然后遍历源目录,对每个文件和子目录进行复制。代码包括了目录名不同和相同的情况,以及文件的字节流复制。

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

需求:将指定目录复制到指定路径下。

1、复制时目录内的子目录以及子文件的结构和内容与源目录相同。

2、目录名与源目录名可能相同,也可能不同。

分析:

假设源目录为:D:\dir  目标目录为:E:\copy

目标目录与源目录名不同时的复制情况:

目标目录与源目录名相同时的复制情况:

        复制一个目录时,要先确认好目标目录是否存在,如果不存在则将目标目录创建好,之后遍历源目录下的所有文件和子目录,将这些文件与子目录复制下来

        复制子目录时,同上。所以,这里要用到递归,在复制目录的方法里遍历源目录,判断所遍历到的是目录时,再次调用复制目录的方法

        复制文件时用字节流将源文件中的数据写入到目标文件中

代码实现:

复制目录(与源目录名不同)

    //复制目录
    public static void copyDirectory(File in, File out){
		//判断目标目录是否存在
		if (!out.exists()) {
			//目标目录不存在,创建此目录
			out.mkdir();
		}
		 //获取目标目录绝对路径
		String path = out.getPath();
		//获取源目录下的所有目录、文件,并遍历
		File[] inFiles = in.listFiles();
		for (File file : inFiles) {
			//更改目标路径
			out = new File(path, file.getName());
			//判断file是否为目录,
			//如果是目录则复制此目录,如果不是则复制此文件
			if (file.isDirectory()) {
				copyDirectory(file, out);
 			} else {
 				copyFile(file, out);
 			}
		}
	}

复制目录(与源目录名相同) 

	//复制目录
	public static void copyDirectory(File in, File out){
		//获取目标目录绝对路径
		String path = out.getPath();
		//更改目标路径
		out = new File(path, in.getName());
		//判断目标目录是否存在
		if (!out.exists()) {
			//目标目录不存在,创建此目录
			out.mkdir();
		}
		//获取源目录下的所有目录、文件,并遍历
		File[] inFiles = in.listFiles();
		for (File file : inFiles) {
			//判断file是否为目录,
			//如果是目录则复制此目录,如果不是则复制此文件
			if (file.isDirectory()) {
				copyDirectory(file, out);
 			} else {
 				File outFile = new File(out, file.getName());
 				copyFile(file, outFile);
 			}
		}
	}

 复制文件

    //复制文件
	public static void copyFile(File in, File out){
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			//创建输入输出流
			fis = new FileInputStream(in);
			fos = new FileOutputStream(out);
			//复制文件————读取源文件数据,写入到目标文件
			byte[] data = new byte[1024];
			int len;
			while ((len = fis.read(data)) != -1) {
				fos.write(data, 0, len);
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			//关闭流
			if (fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

主函数

    public static void main(String[] args) {
		File in = new File("源目录");
		File out = new File("目标目录");
		copyDirectory(in, out);
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值