网站建设晋丰,美发网站怎么做,怎么做seo信息优化,网站建设什么打王思聪【实验7-1】 批量操作文件功能
任务介绍
1#xff0e;任务描述
在日常工作中#xff0c;经常会遇到批量操作系统文件的事情#xff0c;通常情况下#xff0c;只能手动重复的完成批量文件的操作#xff0c;这样很是费时费力。本案例要求编写一个文件管理器#xff0c;…【实验7-1】 批量操作文件功能
任务介绍
1任务描述
在日常工作中经常会遇到批量操作系统文件的事情通常情况下只能手动重复的完成批量文件的操作这样很是费时费力。本案例要求编写一个文件管理器实现文件的批量操作。文件管理器具体功能要求如下
用户输入指令1代表“指定关键字检索文件”此时需要用户输入检索的目录和关键字系统在用户指定的目录下检索出文件名中包含关键字的文件并将其绝对路径展示出来。用户输入指令2代表“指定后缀名检索文件”此时需要用户输入检索的目录和后缀名多个后缀名用逗号分隔系统在用户指定的目录下检索出指定后缀名的文件并将其绝对路径展示出来。用户输入指令3代表“删除文件/目录”此时需要用户输入需要删除掉的文件目录程序执行后会将目录以及目录下的内容全部删除。用户输入指令4代表“退出”即退出该文件管理器程序。
2运行结果
任务运行结果如图7-1所示。 图7-1 运行结果
源路径G:\itcast下的文件如图7-2所示。 图7-2源目录 实现思路
1根据任务介绍和运行结果分析可知首先需要创建一个文件管理器类。可以在类中使用while循环实现控制台中操作指令的多次输入并使用switch语句根据控制台输入的操作指令来判断执行什么操作。
2执行指令1时代表指定关键字检索文件即在目录下查找包含关键字的文件。执行时先要从控制台获取目录和关键字然后将其传到后台的方法中后台可将传入的关键字利用过滤器将其制定成“规则”通过递归的方式遍历文件夹在每个子文件夹下调用过滤器来获取符合规则的文件路径的集合并将集合返回最后打印出来
3执行指令2时代表指定后缀名检索文件即在目录下查找名称结尾是指定后缀的文件。执行时可以先从控制台获取目录和后缀名然后将后缀名拆分成数组并将数组和目录传到后台方法中。后台可用过滤器将后缀名数组循环遍历制定成“规则”通过递归的方式遍历文件夹在每个子文件夹下调用过滤器来获取符合规则的文件路径的集合并将集合返回最后并打印出来
4执行指令3时执行代表根据将输入的目录删除对应的文件夹。执行是先从控制台获取文件夹地址后台先判断File对象是否存在再使用foreach循环遍历删除文件夹下的所有文件最后删除该文件夹
5执行指令4时执行退出该程序的操作该操作可以通过System.exit(0)来实现。
实现代码
1定义DocumentManager类具体如文件7-1所示。
文件7-1 DocumentManager.java
package chapter070;import java.io.File;import java.util.ArrayList;import java.util.Scanner;public class DocumentManager { public static void main(String[] args) throws Exception { Scanner sc new Scanner(System.in); System.out.println(--1:指定关键字检索文件 2:指定后缀名检索文件 3:删除文件/目录 4:退出--); while(true){ System.out.print(请输入指令); int command sc.nextInt(); switch (command) { case 1: searchByKeyWorld();//指定关键字检索文件 break; case 2: searchBySuffix();//指定后缀名检索文件 break; case 3: deleteDir();//删除文件/目录 break; case 4: exit();//退出 break; default: System.out.println(您输入的指令错误); break; } } } // *********1.指定关键字检索文件********* private static void searchByKeyWorld() { Scanner sc new Scanner(System.in); System.out.print(请输入要检索的目录位置); String path sc.next();//从控制台获取路径 File file new File(path); //判断目录是否存在是否是目录 if (!file.exists() || !file.isDirectory()) { System.out.println(path (不是有效目录)); return; } System.out.print(请输入搜索关键字); String key sc.next();//获取关键字 //在输入目录下获取所有包含关键字的文件路径 ArrayListString list FileUtils.listFiles(file,key); for (Object obj : list) { System.out.println(obj);//将路径打印到控制台 } } // *********2.指定后缀名检索文件********// private static void searchBySuffix() { Scanner sc new Scanner(System.in); System.out.print(请输入要检索的目录位置); String path sc.next();//从控制台获取路径 File file new File(path); //判断目录是否存在是否是文件夹 if (!file.exists() || !file.isDirectory()) { System.out.println(path (不是有效目录)); return; } System.out.print(请输入搜索后缀); String suffix sc.next(); String[] suffixArray suffix.split(,);//获取后缀字符串 //在输入目录下获取所有指定后缀名的文件路径 ArrayListString list FileUtils.listFiles(file, suffixArray); for (Object obj : list) { System.out.println(obj);//将路径打印到控制台 } } // *********3.删除文件/目录**********// private static void deleteDir() { Scanner sc new Scanner(System.in); System.out.print(请输入需要删除的源目录); String delpath sc.next();// 从控制台获取源路径 File dir new File(delpath); // 创建一个代表目录的File对象 doDelete(dir); } private static void doDelete(File dir){ if (dir.exists()) { // 判断传入的File对象是否存在 File[] files dir.listFiles(); // 得到File数组 for (File file : files) { // 遍历所有的子目录和文件 if (file.isDirectory()) { doDelete(file); // 如果是目录递归调用deleteDir() } else { // 如果是文件直接删除 file.delete(); } } // 删除完一个目录里的所有文件后就删除这个目录 dir.delete(); } } // *********4.退出**********// private static void exit() { System.out.println(您已退出系统谢谢使用); System.exit(0); }
在文件7-26中第10~30行代码通过while循环等待指令输入并通过switch来判断执行什么动作。第33~50行执行了根据指定的关键字检索文件的动作其中第39行代码用来判断了输入的目录是否有效。第46行代码用于调用后台方法获取符合规则的列表。第52~70行代码执行指定后缀名检索文件其中第64行代码将获得的后缀名字符串拆分成数组并利用第66行代码传入后台获取符合规则的列表。第72~93行代码的作用是将控制台输入的目标文件删除其中第79~93行代码定义doDelete()方法在该方法中使用foreach循环删除子目录与文件。72~78行代码定义deleteDir()方法在该方法中调用doDelete()方法删除目录与文件。
2定义FileUtils类具体如文件7-2所示。
文件7-2 FileUtils.java
package chapter070;import java.io.File;import java.io.FilenameFilter;import java.util.ArrayList;public class FileUtils { /** * 指定关键字检索文件 * param file File对象 * param key 关键字 * return 包含关键字的文件路径 */ public static ArrayListString listFiles(File file, final String key){ FilenameFilter filter new FilenameFilter() { // 创建过滤器对象 // 实现accept()方法 public boolean accept(File dir, String name) { File currFile new File(dir, name); // 如果文件名包含关键字返回true否则返回false if (currFile.isFile() name.contains(key)) { return true; } return false; } }; //递归方式获取规定的路径 ArrayListString arraylist fileDir(file, filter); return arraylist; } /** * 指定后缀名检索文件 * param file File对象 * param suffixArray 后缀名数组 * return 指定后缀名的文件路径 */ public static ArrayListString listFiles(File file, final String[] suffixArray) { FilenameFilter filter new FilenameFilter() { // 创建过滤器对象 // 实现accept()方法 public boolean accept(File dir, String name) { File currFile new File(dir, name); if (currFile.isFile()) { for (String suffix : suffixArray) { if (name.endsWith(. suffix)) { return true; } } } return false; } }; //递归方式获取规定的路径 ArrayListString arraylist fileDir(file, filter); return arraylist; } /** * 递归方式获取规定的路径 * param dir File对象 * param filter 过滤器 * return 过滤器过滤后的文件路径 */ public static ArrayListString fileDir(File dir, FilenameFilter filter){ ArrayListString arraylist new ArrayListString(); File[] lists dir.listFiles(filter); // 获得过滤后的所有文件数组 for (File list : lists) { //将文件的绝对路径放到集合中 arraylist.add(list.getAbsolutePath()); } File[] files dir.listFiles(); // 获得当前目录下所有文件的数组 for (File file : files) { // 遍历所有的子目录和文件 if (file.isDirectory()) { // 如果是目录递归调用fileDir() ArrayListString every fileDir(file, filter); arraylist.addAll(every);//将文件夹下的文件路径添加到集合中 } }//此时的集合中有当前目录下的文件路径和当前目录的子目录下的文件路径 return arraylist; }}
在文件7-27中执行指令1时调用第12~27行的代码其中第13~23行代码用于创建过滤器第25行代码用于调用递归方法。执行指令2时将调用第34~53行代码其中第36~49行代码用于创建过滤器其中第41~45行代码通过循环将所有后缀名都配成了过滤规则。第51行代码调用了递归方法此方法的代码是60~76行方法中第62~66行代码获取当前目录下经过过滤后的文件数组通过循环取其路径存入集合中。第68~74行代码将当前目录下内容循环如果是文件夹则调用自身。