题目描述:扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件
例如:输入你要搜索的目录,然后在你 指定的目录中进行 循环遍历所有文件,找到 含有指定字符的文件,然后输入 y / n ,y 表示删除文件,n 表示不删除文件
这个操作,起始就是遍历目录的操作。
在 Java 文件操作 和 IO(2)-- Java文件系统操作 这篇博客当中,2.1.8标题内容提到:list 和 listFiles 只能列出当前目录中的内容,无法列出子目录的内容(当前目录中的另一个目录中的内容)。
如果要想把子目录,孙子目录,曾孙目录… 等全都列出来,就需要自己编写代码实现了。本篇博客演示的就是这个代码。
那么,这个代码应该怎么写呢?
核心思想:递归。
由于我们的目录结构是树形结构,针对树形结构,递归是一种很好的解决问题的方法。
结果案例演示:
以下的演示,我统一以我本人当前该程序的项目路径为例:
E:\code\gitee\JAVA代码\java-code-\java_File_IO_11.28
其中,绝对路径:
E:\code\gitee\JAVA代码\java-code-\java_File_IO_11.28\test.txt 是一个普通的文本文件。
结果演示一:输入一个非目录的路径
结果演示二:(输入一个所有文件都不包含的关键字)
我写入一个 “csdn”,作为要删除文件中,文件名包含的关键字。
然而该项目路径中,并没有以这样关键字为名的普通文件。
进程结束了,也没有显示:是否要删除文件 这句话,表明:该目录中没有包含着以 csdn 为文件名的文件。
结果演示三:(输入关键字,选择是否删除文件)
我写入一个 “test”,作为要删除文件中,文件名包含的关键字。
然而该项目路径中,包含以 “test” 为文件名的文件有两个,分别是 test.txt 和 test2.txt
设计思路
总体的思路
准备工作:
第一步:我们需要让用户输入一个指定的目录,确定搜索的是哪个目录,搜索该目录里面的文件。
第二步:根据用户输入的目录路径,创建 File对象,同时,判定用户输入的目录路径,是否为一个目录,如果不是,则不进行搜索,直接 return 结束程序。
第三步:如果用户输入的目录路径是一个目录**,就让用户输入要删除的文件中,文件名包含的关键字。
以上步骤没有问题以后,我们就开始遍历目录了。
遍历目录:
遍历目录的代码,我们写到一个方法里面,scanDir( )方法
,传入两个变量,第一个变量:根据目录的路径所创建的File对象(我代码中的 rootfile),第二个变量:要删除的文件中,文件名包含的关键字(我代码中的 keyword)。
scanDir( )方法
遍历目录内容的步骤:
- 获取到目录中的所有文件(File对象),同时,判断该目录是否为一个空目录
- 遍历当前目录中的内容,然后判断当前文件时普通文件还是目录,两种情况:
2.1 如果是普通文件,则调用deleteFile( )方法
,进行判定是否存在关键字并选择删除操作
2.2 如果是目录,则递归调用本方法
deleteFile( )方法
判定和选择删除:
对该普通文件进行判定,判断文件名是否包含关键字
- 该文件的文件名包含关键字,显示出该文件的绝对路径,并询问用户,是否删除文件,如果是,输入 y ,如果不删除文件,则输入 n 。
- 该文件的文件名不包含关键字,结束该方法。
使用代码,分步实现
1. 准备工作(输入目录路径,创建File对象,判断,输入关键字)
// 准备工作:
// 第一步:先让用户输入一个指定的目录,搜索该目录里面的文件
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要搜索的目录路径(绝对 or 相对):");
String rootDir = scanner.next();
// 第二步:根据用户输入的目录路径,创建 File对象
File rootfile = new File(rootDir);
// 其次,判断用户输入的目录路径,是否是一个目录
if(!rootfile.isDirectory()) {
System.out.println("输入的不是目录!");
return;
}
// 第三步:让用户输入要删除的文件中,文件名包含的关键字
System.out.println("请输入要删除文件中包含的关键字:");
String keyword = scanner.next();
2. 开始遍历目录
scanDir(rootfile,keyword);
3. 实现scanDir方法
private static void scanDir(File rootDir, String keyword) {
}
3.1 获取到目录中的所有文件(File对象),同时,判断该目录是否为一个空目录
// 第一步:获取到目录中的所有文件(File对象)
File[] files = rootDir.listFiles();
// 判断当前目录是否为空目录
if (files == null) {
// 当前目录为空
return;
}
3.2 遍历当前目录中的内容,然后判断当前文件时普通文件还是目录,两种情况:
// 第二步:遍历当前目录中的内容
for (File file:files) {
// 判断当前文件,是普通文件,还是目录
if (file.isFile()) {
// 1.如果是普通文件,则调用deleteFile方法,进行判定是否存在关键字并选择删除操作
deleteFile(file,keyword);
}else {
// 2.如果是目录,则递归调用本方法
scanDir(file,keyword);
}
}
}
3.2.1 如果是普通文件,则调用deleteFile方法,进行判定并选择删除操作
//1.如果是普通文件,则调用deleteFile方法,进行判定并选择删除操作
deleteFile(file,keyword);
其中,deleteFile方法判定和选择删除:
对该普通文件进行判定,判断文件名是否包含关键字
if (file.getName().contains(keyword)) {
// 该文件的文件名包含关键字
System.out.println("发现文件:" + file.getAbsolutePath() + ", 包含关键字");
System.out.println("是否要删除该文件?( y / n):");
Scanner scanner = new Scanner(System.in);
String input = scanner.next();
}
- 该文件的文件名包含关键字,显示出该文件的绝对路径,并询问用户,是否删除文件,如果是,输入 y ,如果不删除文件,则输入 n 。
// 根据输入的字符,选择是否删除文件
if (input.equalsIgnoreCase("y")) {
file.delete();
System.out.println("文件已删除!");
}else {
System.out.println("您选择不删除文件!");
return;
}
- 该文件的文件名不包含关键字,结束该方法。
3.2.2 如果是目录,则递归调用本方法
//2.如果是目录,则递归调用本方法
scanDir(file,keyword);
完整代码
import java.io.File;
import java.util.Scanner;
public class demo1 {
public static void main(String[] args) {
// 准备工作:
// 第一步:先让用户输入一个指定的目录,搜索该目录里面的文件
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要搜索的目录路径(绝对 or 相对):");
String rootDir = scanner.next();
// 第二步:根据用户输入的目录路径,创建 File对象
File rootfile = new File(rootDir);
// 其次,判断用户输入的目录路径,是否是一个目录
if(!rootfile.isDirectory()) {
System.out.println("输入的不是目录!");
return;
}
// 第三步:让用户输入要删除的文件中,文件名包含的关键字
System.out.println("请输入要删除文件中包含的关键字:");
String keyword = scanner.next();
// 开始遍历目录
scanDir(rootfile,keyword);
}
private static void scanDir(File rootDir, String keyword) {
System.out.println("搜索目录:" + rootDir.getAbsolutePath());
// 第一步:获取到目录中的所有文件(File对象)
File[] files = rootDir.listFiles();
// 判断当前目录是否为空目录
if (files == null) {
// 当前目录为空
return;
}
// 第二步:遍历当前目录中的内容
for (File file:files) {
// System.out.println("搜索目录 & 文件:" + file.getAbsolutePath());
// 判断当前文件,是普通文件,还是目录
if (file.isFile()) {
// 1.如果是普通文件,则调用deleteFile方法,进行判定并选择删除操作
deleteFile(file,keyword);
}else {
// 2.如果是目录,则递归调用本方法
scanDir(file,keyword);
}
}
}
private static void deleteFile(File file,String keyword) {
// 进行判定,是否包含要删除文件的关键字
if (file.getName().contains(keyword)) {
// 该文件的文件名包含关键字
System.out.println("发现文件:" + file.getAbsolutePath() + ", 包含关键字");
System.out.println("是否要删除该文件?( y / n):");
Scanner scanner = new Scanner(System.in);
String input = scanner.next();
// 根据输入的字符,选择是否删除文件
if (input.equalsIgnoreCase("y")) {
file.delete();
System.out.println("文件已删除!");
}else {
System.out.println("您选择不删除文件!");
return;
}
}
}
}