文件的递归查找、文件复制、文件夹复制的工具包
import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @author Tangwei * */ public class FileUtils { /** * 重载方法(一参) --> 递归文件 , 过滤文件 * * @param dir * @return */ public static List<File> getAllFiles(String dir) { // dir 文件路径 return getAllFiles(new File(dir)); } /** * 重载方法 --> 递归文件 , 过滤文件 * * @param file * @return (二参) */ public static List<File> getAllFiles(File dir) { return getAllFiles(dir, null); } /** * 重载方法 (二参) --> 递归文件 , 过滤文件 * * @param dir * @param object * @return */ // dir 文件路径 suffixs 后缀 (过滤使用) public static List<File> getAllFiles(File dir, String[] suffixs) { // list数组,存储文件 List<File> files = new ArrayList<File>(); if (dir.isDirectory()) {// 如果是文件夹 // 递归遍历 files --> 文件 recursionFiles(dir, files, suffixs); } else { // 如果不是文件夹,直接添加 return 返回 files.add(dir); } return files; } private static void recursionFiles(File dir, List<File> list, String[] suffixs) { // listFiles 文件清单 File[] filesList = dir.listFiles(new FileFilter() { @Override // 文件过滤器 (白名单) public boolean accept(File pathname) { if (suffixs == null) // 不过滤 return true; // 如果是文件夹,不过滤 if (pathname.isDirectory()) return true; // 如果后缀符合规范,不过滤 for (String suffix : suffixs) { if (pathname.getName().endsWith(suffix)) { return true; } } // 如果不是文件,也不在我的后缀表中,过滤掉 return false; } }); // 如果文件为空,返回 if (filesList == null) return; for (File file : filesList) { if (file.isDirectory()) { // 不要忘了,将dir改成file,不然递归永远不会结束 recursionFiles(file, list, suffixs);// 该方法先压入栈。执行第二次 } // 如果后缀不为空 if (suffixs != null) { // 如果是文件 if (file.isFile()) { list.add(file); } } else { list.add(file); } } } /** * 重载方法 --> copy文件 * * @param src * @param dest * @throws IOException */ public static void copyFile(String src, String dest) throws IOException { copyFile(new File(src), new File(dest)); } // src 源文件路径 dest 目标文件路径 (复制) public static void copyFile(File src, File dest) throws IOException { // 复制都使用字节流 if (src.isDirectory()) { throw new IllegalArgumentException("源文件是一个文件夹,请调用copyDir方法"); } // 给目标文件创建父路径名 。 mkdirs-->创建文件夹 dest.getParentFile().mkdirs(); FileInputStream fis = new FileInputStream(src); FileOutputStream fos = new FileOutputStream(dest); // 开始读写 int len = 0; byte[] buf = new byte[1024]; while ((len = fis.read(buf)) != -1) { fos.write(buf, 0, len); fos.flush(); } fos.close(); fis.close(); } /** * 重载方法 --> copy文件夹 * * @param src * @param dest */ public static void copyDir(String src, String dest,String[] suffixs) { copyDir(new File(src), new File(dest),suffixs); } public static void copyDir(File src, File dest, String[] suffixs) { // 目标文件夹 不允许是 源文件件 的子文件 // getAbsolutePath 绝对路径 if (dest.getAbsolutePath().toLowerCase() .contains(src.getAbsolutePath().toLowerCase())) { throw new IllegalArgumentException("目标文件夹是源文件夹的子文件,不允许复制"); } else if (src.isFile()) { throw new IllegalArgumentException("源文件是一个文件,请调用copyFile的方法"); } else if (!src.exists()) { throw new IllegalArgumentException("源文件夹不存在,请确定后再调用"); } // 给目标文件创建文件夹 dest.mkdirs(); // 开始copy,为每一个copy的文件,创建一个线程来操作,使用线程池来管理需要copy的所有线程 // 1. 将所有文件全部找到 ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(8);// 创建固定线程池 List<File> allFiles = getAllFiles(src,suffixs);// 调用递归文件方法 for (File file : allFiles) { //file if (file.isFile()) { // 目标文件名 = 源文件名,去将源文件夹src替换成目标文件夹dest String fileName = file.getAbsolutePath().replace( src.getAbsolutePath(), dest.getAbsolutePath()); newFixedThreadPool.execute(new Runnable() { // 启动线程 @Override public void run() { // copyFile System.out.println(Thread.currentThread() .getName() + ":复制" + file.getAbsolutePath() + "到" + fileName); try { copyFile(file, new File(fileName));// fileName } catch (IOException e) { e.printStackTrace(); } } }); } } // 不在接受新的任务,以前的任务继续执行完毕 newFixedThreadPool.shutdown(); // 停止线程 }
//文件夹复制与文件的复制 区别在于:各个文件对应其文件夹路径的复制,然后只需要list装载,foreach遍历
// public static void main(String[] args) { // copyDir("C:\\Users\\Windows\\Desktop\\Android", "d:\\abc\\ccc",new String[]{".java"}); // } }