import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Scanner;
public class homework1 {
public static boolean falg = true;
public static void main(String[] args) throws Exception {
//出于代码复用性的考虑,应将重复的代码抽取成一个方法
// String readStrForConsole = readStrForConsole();
// File souFile = new File(readStrForConsole); 与下边等价
File souFile = new File(readStrForConsole());
File desFile = new File(readStrForConsole());
//判断是否是一个文件夹,如果不是一个文件夹,则输入程序错误 -->健壮性的考虑
if(!souFile.isDirectory() || !desFile.isDirectory()){
System.out.println("您输入的路劲有误");
}else{
//走到这里表示数据符合要求,都是文件夹,进行拷贝
copyDirToDir(souFile,desFile);
}
}
private static void copyDirToDir(File souFile, File desFile) throws Exception {
//拿到源目录的所有子文件为做拷贝做准备
File[] listFiles = souFile.listFiles();
//遍历,拿到源目录的所有子文件
for (File thisFile : listFiles) {
if(thisFile.isFile()){
//表示是一个文件
//创建流对象,反复的读取,应该读取的是遍历到的对象thisFile
FileInputStream fis = new FileInputStream(thisFile);
//写: 应该写到目的地址中去,
//拷贝: D:\\a --->D:\\aa
// D:\\a\bb.txt --->D:\\aa\bb.txt(这是想要的file文件路劲)
// 就是目的地址的路劲 + \ + 源地址的名称
FileOutputStream fos = new FileOutputStream(desFile.getPath()+File.separator+thisFile.getName());
//一次创建合适大小的数组,一次性就能写好
// 优点:
//书写简单,长度正好合适
// 缺点:
//当需要拷贝的文件长度过大时,开辟数组浪费资源
//当需要拷贝的文件长度过大时,内存可能不够
byte [] bytes = new byte[fis.available()];
fos.write(bytes);
}else{
//是一个文件夹
//需要创建一个文件
File desDir = new File(desFile.getPath()+File.separator+thisFile.getName());// D:\\a\\aa\\a D:\\b\\aa
desDir.mkdir();//创建一个文件
// 递归调用
copyDirToDir(thisFile,desDir);
}
}
}
private static String readStrForConsole() {
//定义了一个boolean静态变量falg;
Scanner sc = new Scanner(System.in);
if(falg){
//默认值是true ,第一次走这里
System.out.println("请输入源文件");
//因为第二次调用,要走else,所以将falg改为false;
falg =false;
}else{
System.out.println("请输入目标文件");
}
//将值返回
return sc.nextLine();
}
}
|