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);
}
}
}
代码执行过程都写在了代码旁边。
重要的思路就是:一个拷贝方法,一个递归方法
- 拷贝方法:当判断传入的路径表示的是文件的时候,就可以拷贝了,在这里面执行拷贝
- 递归方法:当判断不为文件,而为目录时,调用mkdirs()方法多重创建出所有目录,再执行递归方 法,循环执行,直到最终判断不为目录为止