递归查找指定目录中(包括子目录中),所有的.java文件,
并且,把所有这些找到的java文件,复制到一个指定的目录下
package com;
import java.io.*;
//保证1文件夹和restore文件夹是真实存在的
public class Work {
public static void main(String[] args) throws IOException {
//指定目录
File dir = new File("D:\\1");
//放筛选后文件的目标目录
File des = new File("D:\\restore");
findFile(dir, des);//把java文件从dir复制到des路径下
}
//查找指定目录中(包括子目录中),所有的.java文件,
public static void findFile(File f, File des) throws IOException {
if (f.isFile()) {//判断输入路径是不是文件
if (f.getName().endsWith(".java")) {//如果已经是java文件
copyFile(f, des);//把文件f复制到des
return;
}
}
//获取目录的下的所有File对象(包括文件和文件夹)
File[] files = f.listFiles();
//判断,如果是file对象不是一个目录而是一个空目录
if (files.length == 0) {
return;
}
// 程序执行到这里,那么一定是一个目录,且不是空目录
for (int i = 0; i < files.length; i++) {
//遍历获取的file数组
//如果这个file对象仍然是一个目录,递归查找
if (files[i].isDirectory() == true) {
findFile(files[i], des);
} else {
//file对象是文件,判断是不是java文件
if (files[i].getName().endsWith(".java")) {
copyFile(files[i], des);//直接复制文件到指定路径
}
}
}
}
//把文件f复制到des,
public static void copyFile(File f, File des) throws IOException {
// 创建输入字节流对象,传参是要读入内存的文件路径("D:\\1.java")
FileInputStream in = new FileInputStream(f.getAbsoluteFile());
//des是目录("E:\\restore"),建一个新的File对象,
// 内容:des的路径拼接要复制的文件名,结果("E:\\restore\\1.java")
File file = new File(des.getAbsoluteFile(), f.getName());
// 创建字节输出流对象,传参是内存数据要写入的文件路径
FileOutputStream out = new FileOutputStream(file);
//用多个字符获取文件
byte[] bytes = new byte[1024];
int len;
while ((len = in.read(bytes)) != -1) {//1、先把文件副本读入内存
out.write(bytes, 0, len);//2、再把文件副本写到外存的新位置
}
in.close();//关闭资源
out.close();
}
}