之前面试遇到过这个需求,复制文件夹及其子文件夹下的内容到指定文件夹.突然想起来,写个程序记录一下。
public class CopyFile {
/*
* 复制文件夹及其子文件夹下的内容到另一个文件中
*/
public static void main(String[] args) throws IOException {
String url1 = "D:/测试/123"; // 源文件夹
String url2 = "D:/123"; // 目标文件夹
new File(url2).mkdirs();
File[] fileList=new File(url1).listFiles();
for (int i = 0; i < fileList.length; i++) {
if(fileList[i].isFile()){
copyFile(fileList[i],new File(url2+File.separator+fileList[i].getName()));
}else if(fileList[i].isDirectory()){
String sourceDir=url1+File.separator+fileList[i].getName();
String targetDir=url2+File.separator+fileList[i].getName();
copyDirectiory(sourceDir, targetDir);
}
}
}
// 复制文件
public static void copyFile(File sourceFile, File targetFile) throws IOException{
BufferedInputStream inBuff=null;
BufferedOutputStream outBuff=null;
try {
inBuff=new BufferedInputStream(new FileInputStream(sourceFile));
outBuff=new BufferedOutputStream(new FileOutputStream(targetFile));
byte[] b=new byte[5*1024];
int len;
while((len=inBuff.read(b))!=-1){
outBuff.write(b, 0, len);
}
outBuff.flush();
} catch (Exception e) {
e.printStackTrace();
}finally{
if (inBuff != null){
inBuff.close();
}
if (outBuff != null){
outBuff.close();
}
}
}
// 复制文件夹
public static void copyDirectiory(String sourceDir, String targetDir) throws IOException {
new File(targetDir).mkdirs();
File[] fileList=new File(sourceDir).listFiles();
for (int i = 0; i < fileList.length; i++) {
if(fileList[i].isFile()){
copyFile(fileList[i],new File(new File(targetDir).getAbsolutePath()+File.separator+fileList[i].getName()));
}else if(fileList[i].isDirectory()){
String dir1=sourceDir+File.separator+fileList[i].getName();
String dir2=targetDir+File.separator+fileList[i].getName();
copyDirectiory(dir1, dir2);
}
}
}
}
有时候,我们遇到一个目录很深的文件夹,我们需要取出目录下所有的某类文件,不如.txt文件,图片等。
public class FileListCopy {
/**
* 遍历文件夹下的(某类)文件,并复制到指定文件夹
*/
private static String sourceDir = "D:/测试/123";//源目录
private static String targetDir = "D:/123";//目标目录
private static String fileType = ".txt";//关键字
private static List<File> filesList = new ArrayList<>();//存放遍历的文件
public static void main(String[] args) throws IOException {
new File(targetDir).mkdirs();
File[] arr =new File(sourceDir).listFiles();//源文件夹
List<File> tempList = new ArrayList<>();
for(int i=0;i<arr.length;i++){
tempList.add(arr[i]);
}
searchDirectory(tempList);
copyFile(filesList,fileType,targetDir);
System.out.println("复制完成!!");
}
//遍历取出所有文件
public static void searchDirectory(List<File> list){
List<File> firstDirList = new ArrayList<>();//一级目录
List<File> subDirList = new ArrayList<>();//一级目录下的子目录(包括文件夹和文件)
//遍历的文件夹,将文件和文件夹分类
for(File file: list){
if(file.isDirectory()){
firstDirList.add(file);
}else{
filesList.add(file);//文件存放到filesList中
}
}
/**
* 遍历子文件夹
* 递归调用该方法,把目录和文件分开
* */
if(firstDirList.size()>0||!firstDirList.isEmpty()){
for(int i=0;i<firstDirList.size();i++){
File[] fileArr = firstDirList.get(i).listFiles();
for(int j=0;j<fileArr.length;j++){
subDirList.add(fileArr[j]);
}
}
searchDirectory(subDirList);
}
return;
}
//文件复制
public static void copyFile(List<File> filesList,String fileType,String targetDir) throws IOException{
new File(targetDir).mkdirs();
BufferedInputStream inBuff = null;
BufferedOutputStream outBuff = null;
for(File file :filesList){
if(file.isFile()){
//文件过滤,需求不同自己定义
if(file.toString().toLowerCase().contains(fileType.toLowerCase())){
//把文件写到指定 的文件夹中
try{
inBuff = new BufferedInputStream(new FileInputStream(new File(file.toString())));
outBuff = new BufferedOutputStream(new FileOutputStream(new File(targetDir+File.separator+file.getName())));
byte[] b = new byte[1024 * 5];
int len;
while ((len = inBuff.read(b)) != -1){
outBuff.write(b, 0, len);
}
outBuff.flush();
}
catch (Exception e){
e.printStackTrace();
}finally{
if (inBuff != null){
inBuff.close();
}
if (outBuff != null){
outBuff.close();
}
}
}
}
}
}
}