Java中递归实现复制文件夹和文件

时间:2022-07-09 21:34:44

单级目录实现(即指定文件夹中无文件夹):

package day21_IO练习;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/*
* 需求:复制单级目录
*
* 数据源:D:\\Demo
* 目的源:D:\\test
*
* 分析:
* A:封装目录
* B:获取该目录下的所有文本的File数组
* C:遍历该File数组,得到每一个File对象
* D:把该File进行复制
* */

public class CopyFolderDemo {

public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//封装目录
File srcFolder = new File("D:\\Demo");
File destFolder = new File("D:\\test");
//判断目的目录是否存在
if(!(destFolder.exists())){
//创建
destFolder.mkdirs();
}
// 获取该目录下的所有文本文件
File[] arrayFiles=srcFolder.listFiles();
//遍历该数组,得到每一个File对象
for(File file:arrayFiles){
//数据源:D:\\Demo\\**
//目的源:D:\\test\\**
String name=file.getName();
//创建目的文件
File newFile = new File(destFolder,name);
//复制
copy(file,newFile);
}
}

public static void copy(File file, File newFile) throws IOException {
// TODO Auto-generated method stub
//创建字节流缓冲对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newFile));

//读写数据
byte [] bys=new byte[1024];
int len=0;
while((len=bis.read(bys))!=-1){
bos.write(bys, 0, len);
}

//释放资源
bis.close();
bos.close();
}

}

多级目录实现:

package day21_IO练习;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/*
* 需求:复制多级目录
*
* 数据源:D:\\Demos
* 目的源:C:\\
*
* 分析:
* A:封装数据源File
* B:封装目的源File
* C:判断该File是文件夹还是文件
* a:是文件夹(递归实现)
* 就在目的地目录下创建该文件夹
* 获取该File对象下的所有文件或者文件夹File对象
* 遍历得到每一个File对象
* 回到C
* b:是文件
* 直接赋值(字节流)
* */

public class CopyFoldersDemo {
public static void main(String[] args) throws IOException {
//封装数据源File
File srcFolder = new File("D:\\Demos");
//封装目的源File
File destFolder = new File("C:\\");

//复制文件夹
copyFolder(srcFolder,destFolder);

}

public static void copyFolder(File srcFolder, File destFolder) throws IOException {
// TODO Auto-generated method stub
//判断该File是文件夹还是文件
if(srcFolder.isDirectory()){
//是文件夹
//在目的地创建相同目录
File newFolder = new File(destFolder,srcFolder.getName());
newFolder.mkdir();
//遍历该对象
File [] fileArray=srcFolder.listFiles();
for(File file:fileArray){
//递归文件夹
copyFolder(file, newFolder);
}

}else{
//是文件
//递归出口
String name=srcFolder.getName();
File NewFile = new File(destFolder,name);
copy(srcFolder,NewFile);
}
}
//复制文件
public static void copy(File file, File newFile) throws IOException {
// TODO Auto-generated method stub
//创建字节流缓冲对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newFile));

//读写数据
byte [] bys=new byte[1024];
int len=0;
while((len=bis.read(bys))!=-1){
bos.write(bys, 0, len);
}

//释放资源
bis.close();
bos.close();
}
}