在日常工作中,经常会遇到批量操作系统文件的事情,通常情况下,只能手动重复的完成批量文件的操作,这样很是费时费力。
本案例要求编写一个文件管理器,实现文件的批量操作。 文件管理器具体功能要求如下:
- 用户输入指令1,代表“
指定关键字检索文件
”,此时需要用户输入检索的目录和关键字,系统在用户指定的目录下检索出文件名中包含关键字的文件,并将其绝对路径展示出来。 - 用户输入指令2,代表“
指定后缀名检索文件
”,此时需要用户输入检索的目录和后缀名(多个后缀名用逗号分隔),系统在用户指定的目录下检索出指定后缀名的文件,并将其绝对路径展示出来。 - 用户输入指令3,代表“
删除文件/目录
”,此时需要用户输入需要删除掉的文件目录,程序执行后会将目录以及目录下的内容全部删除。 - 用户输入指令4,代表“
退出
”,即退出该文件管理器程序。
package cn.javabs.cases;
import java.io.File;
import java.util.ArrayList;
import java.util.Scanner;
public class DocManager {
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();//获取关键字
//在输入目录下获取所有包含关键字的文件路径
ArrayList<String> 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(",");
//在输入目录下获取所有指定后缀名的文件路径
ArrayList<String> 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数组
File[] files = dir.listFiles();
// 遍历所有的子目录和文件
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);
}
}
工具类:
代码语言:javascript复制import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
public class FileUtils {
/**
* 指定关键字检索文件
* @param file File对象
* @param key 关键字
* @return 包含关键字的文件路径
*/
public static ArrayList<String> 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;
}
};
//递归方式获取规定的路径
ArrayList<String> arraylist = fileDir(file, filter);
return arraylist;
}
/**
* 指定后缀名检索文件
* @param file File对象
* @param suffixArray 后缀名数组
* @return 指定后缀名的文件路径
*/
public static ArrayList<String> 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;
}
};
//递归方式获取规定的路径
ArrayList<String> arraylist = fileDir(file, filter);
return arraylist;
}
/**
* 递归方式获取规定的路径
* @param dir File对象
* @param filter 过滤器
* @return 过滤器过滤后的文件路径
*/
public static ArrayList<String> fileDir(File dir, FilenameFilter filter){
ArrayList<String> arraylist = new ArrayList<String>();
// 获得过滤后的所有文件数组
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()
ArrayList<String> every = fileDir(file, filter);
arraylist.addAll(every);//将文件夹下的文件路径添加到集合中
}
}
//此时的集合中有当前目录下的文件路径,和当前目录的子目录下的文件路径
return arraylist;
}
}