Java||编程实现目录拷贝

前言

这两天系统的学习了基于java.io.*;包下的IO流相关的内容。就尝试着自己实现了目录拷贝,测试通过后,迫不及待分享给大家。感兴趣的就往下看吧。

需求分析

其实在使用电脑时,拷贝文件十分常见。可以说就是“Ctrl + c” 再“Ctrl + v” 的事情。其原理其实并不复杂:
1)首先,待拷贝的源文件的部分内容被读取到内存;
2)接着,将内存里的内容读取到目的路径下;
3)然后,判断源文件是否还有内容未读取(拷贝),是则继续拷贝,否则结束。

本次项目的实现主要涉及java.io包下的三个类:
1)FileInputStream
该类可以用来读入任何类型的文件
2)FileOutputStream
该类可以用来输出文件
3)File
该类主要用来处理文件:判断文件是文件夹还是文件、判断文件是不是隐藏文件、获取文件夹下所有文件等

源代码

1)拷贝文件夹(不包括内容)
【CopyMuLu.java】

import java.io.*;
public class CopyMuLu {

	public File copymulu(File fileCopy,File f){
		File newf = new File(fileCopy.getAbsoluteFile() + "\\" + f.getName());
		if(!newf.exists()) {
			newf.mkdir();
		}
		return new File(newf.getAbsolutePath());
	}
}

2) 拷贝文件
【CopyFile.java】

import java.io.*;
public class CopyFile {

	public void copyfile(File file, File fileCopy, File f){
		FileInputStream fis = null;
		FileOutputStream fos = null;
		
		try {
			//拼接源路径、目标路径
			fis = new FileInputStream(file.getAbsolutePath() + "\\" + f.getName());
			fos = new FileOutputStream(fileCopy.getAbsoluteFile() + "\\" + f.getName());
			
			byte[] b = new byte[1024*1024];//中转,将内容暂存于此
			
			int count = 0;
			while((count = fis.read(b)) != -1) {
				fos.write(b, 0, count);
			}

			//刷新
			fos.flush();
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {//关闭文件
				fos.close();
				fis.close();
				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
}

3) 套娃
【Copyyy.java】
拷贝指定目录下的直接文件、文件夹:
a. 文件直接复制;
b. 文件夹只拷贝文件夹(不拷贝文件夹内容),同时递归实现套娃(新建一个对象传入两个参数:当前源文件作为新对象的源文件;当前目的文件作为新对象的目的文件)

import java.io.File;
public class Copyyy {
	public void copyyy(File file, File fileCopy){
		if(!fileCopy.exists()) {//目标文件不存在则创建
			fileCopy.mkdir();
		}
		
		File[] files = file.listFiles();
		for(File f : files) {
			if(f.isHidden()) {//不拷贝隐藏文件
				continue;
			}
			if(f.isFile() ) {
				CopyFile cf = new CopyFile();
				cf.copyfile(file, fileCopy, f);
			}else {
				CopyMuLu cml = new CopyMuLu();
				File n = cml.copymulu(fileCopy, f);
				
				//套娃
				Copyyy c1 = new Copyyy();
				c1.copyyy(f, n);
			}
		}
	}
}

4)测试
【Test.java】
测试案例我选择将"E:\CopyTest"目录下的所有文件拷贝到“F:\copy”目录下的。即:
源目录:E:\CopyTest
目的目录:F:\copy
运行前目录情况:
在这里插入图片描述
在这里插入图片描述

import java.io.File;
public class Test {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		File file = new File("E:\\CopyTest");//待拷贝目录
		File fileCopy = new File("F:\\copy");//目标目录
	
		Copyyy c = new Copyyy();
		c.copyyy(file, fileCopy);
	}

}

运行后对应目录情况:
在这里插入图片描述
在这里插入图片描述

测试效果

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值