写一个小工具,需求是从一个文件夹中搜索指定关键字的文件,并将搜索结果复制或者移动到新的目录下,需要保持原目录结构,并且关键字可灵活指定,并且可以指定是负责还是移动
import java.io.BufferedReader; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.nio.channels.FileChannel; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Scanner; public class TextCopyUtil { static int countFiles = 0;// 声明统计文件个数的变量 static int countFolders = 0;// 声明统计文件夹的变量 static String srcFolderPath = "D:\\\\快盘";// 默认目录 static String destFolderPath = "D:\\\\1360Downloads";// 目标目录 static String keyword = "会议纪要.txt"; static String type = "copy"; public static void main(String[] args) {// java程序的主入口处 System.out.println("现在开始操作批量处理文件"); System.out.println("你要处理的文件为:"+args[0]); List<String> result = txt2StringList(new File(args[0])); System.out.print("\t默认目录"); System.out.print("\t目标目录"); System.out.print("\t关键字"); System.out.println("\t处理方式(move表示移动,copy表示复制)"); for (String string : result) { String[] arr = string.split("\t"); String srcFolderPath = arr[0];// 默认目录 String destFolderPath = arr[1];// 目标目录 String keyword = arr[2]; String type = arr[3]; System.out.print("\t"+srcFolderPath); System.out.print("\t"+destFolderPath); System.out.print("\t"+keyword); System.out.println("\t"+type); Scanner input = new Scanner(System.in); System.out.println("如果和预期一致请输入数字1,否则其他数字"); String name = input.nextLine(); if("1".equals(name)){ System.out.println(Calendar.getInstance().getTimeInMillis()); run(srcFolderPath, destFolderPath, keyword, type); System.out.println(Calendar.getInstance().getTimeInMillis()); } } } public static List<String> txt2StringList(File file) { List<String> result = new ArrayList<String>(); try { BufferedReader br = new BufferedReader(new FileReader(file));// 构造一个BufferedReader类来读取文件 String s = null; while ((s = br.readLine()) != null) {// 使用readLine方法,一次读一行 result.add(s); } br.close(); } catch (Exception e) { e.printStackTrace(); } return result; } /** * 执行搜索并复制 * @param srcFolderPath 搜索目录 * @param destFolderPath 复制目标目录 * @param keyword 关键字 */ public static void run(String srcFolderPath, String destFolderPath, String keyword,String type) { File srcFolder = new File(srcFolderPath);// 默认目录 File destFolder = new File(destFolderPath);// 目标目录 if (!srcFolder.exists()) {// 如果文件夹不存在 System.out.println("目录不存在:" + srcFolder.getAbsolutePath()); return; } if (!destFolder.exists()) {// 如果文件夹不存在 mkDir(destFolder); System.out.println("目录创建成功:" + destFolder.getAbsolutePath()); } File[] result = searchFile(srcFolder, keyword);// 调用方法获得文件数组 System.out.println("在 " + srcFolder + " 以及所有子文件时查找对象" + keyword); System.out.println("查找了" + countFiles + " 个文件," + countFolders + " 个文件夹,共找到 " + result.length + " 个符合条件的文件:"); System.out.println("开始复制以上所有查找到的对象"); for (int i = 0; i < result.length; i++) {// 循环显示文件 File file = result[i]; File destFile = new File(file.getAbsolutePath().replaceFirst(srcFolderPath, destFolderPath)); if(type!=null&&"move".equals(type)){ //移动 file.renameTo(destFile); }else{ //复制 fileChannelCopy(file, destFile); } System.out.println(file.getAbsolutePath() + " 复制到 " + destFile.getAbsolutePath());// 显示文件绝对路径 } } /** * 创建文件夹 * * @param file */ public static void mkDir(File file) { if (file.getParentFile().exists()) { if (!file.exists()) { file.mkdir(); } } else { mkDir(file.getParentFile()); file.mkdir(); } } /** * 使用文件通道的方式复制文件 * * @param s * 源文件 * @param t * 复制到的新文件 */ public static void fileChannelCopy(File s, File t) { mkDir(t.getParentFile()); FileInputStream fi = null; FileOutputStream fo = null; FileChannel in = null; FileChannel out = null; try { fi = new FileInputStream(s); fo = new FileOutputStream(t); in = fi.getChannel();// 得到对应的文件通道 out = fo.getChannel();// 得到对应的文件通道 in.transferTo(0, in.size(), out);// 连接两个通道,并且从in通道读取,然后写入out通道 } catch (IOException e) { e.printStackTrace(); } finally { try { fi.close(); in.close(); fo.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 递归查找包含关键字的文件 * * @param folder * @param keyWord * @return */ public static File[] searchFile(File folder, final String keyWord) { File[] subFolders = folder.listFiles(new FileFilter() {// 运用内部匿名类获得文件 public boolean accept(File pathname) {// 实现FileFilter类的accept方法 if (pathname.isFile())// 如果是文件 countFiles++; else // 如果是目录 countFolders++; if (pathname.isDirectory() || (pathname.isFile() && pathname.getName() .toLowerCase() .contains(keyWord.toLowerCase())))// 目录或文件包含关键字 return true; return false; } }); List result = new ArrayList();// 声明一个集合 if (subFolders != null) { for (File subFolder : subFolders) {// 循环显示文件夹或文件 if (subFolder.isFile()) {// 如果是文件则将文件添加到结果列表中 result.add(subFolder); } else {// 如果是文件夹,则递归调用本方法,然后把所有的文件加到结果列表中 File[] foldResult = searchFile(subFolder, keyWord); if (foldResult != null) { for (File fold : foldResult) {// 循环显示文件 result.add(fold);// 文件保存到集合中 } } } } } File files[] = new File[result.size()];// 声明文件数组,长度为集合的长度 result.toArray(files);// 集合数组化 return files; } }
效果如下:
附读取规则文件内容
D:\快盘\[MobileBackup] D:\\1360Downloads .mp3 copy D:\快盘\[MobileBackup]\[Pictures]\Pictures D:\\1360Downloads .png copy
时间: 2024-10-09 12:16:37