思路解析
- 目录的拷贝要获取源目录和拷贝目录。
public static void main(String[] arg){
//源目录
File srcFile = new File("D:\\a\\b");
//拷贝目录(目标目录)
File destFile = new File("C:\\c\\d");
//递归调用
copy(srcFile,destFile);
}
- 采用递归法进行拷贝,递归结束的条件是,当srcFile是文件而不是目录时,结束递归
public static void copy(File srcFile,File destFile){
if(srcFile.isFile())
return;
}
- 一个目录下可能会有多个子目录,所有我们要获取这些子目录,并进行递归。
public static void copy(File srcFile,File destFile){
if(srcFile.isFile())
return;
File[] files = srcFile.listFiles();
for(File file:files){
copy(file,destFile);
}
}
- 写到这步时,我们可以写一个输出语句,来判断递归算法是否正确。
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);
}
}
如果输出的字符串是你源目录的路径信息,此时,这个递归调用是可以使用的;
- 创建空的文件和目录
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);
}
}
- 因为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,中间部分为详解