Java 文件操作 和 IO(5)-- 综合案例练习 -- 示例一

发布于:2025-06-02 ⋅ 阅读:(23) ⋅ 点赞:(0)

题目描述:扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件


例如:输入你要搜索的目录,然后在你 指定的目录中进行 循环遍历所有文件,找到 含有指定字符的文件,然后输入 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( )方法遍历目录内容的步骤:

  1. 获取到目录中的所有文件(File对象),同时,判断该目录是否为一个目录
  2. 遍历当前目录中的内容,然后判断当前文件时普通文件还是目录两种情况
    2.1 如果是普通文件,则调用deleteFile( )方法,进行判定是否存在关键字并选择删除操作
    2.2 如果是目录,则递归调用本方法

deleteFile( )方法判定和选择删除:
对该普通文件进行判定,判断文件名是否包含关键字

  1. 该文件的文件名包含关键字,显示出该文件的绝对路径,并询问用户,是否删除文件,如果是,输入 y ,如果不删除文件,则输入 n
  2. 该文件的文件名不包含关键字,结束该方法

使用代码,分步实现

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();
}
  1. 该文件的文件名包含关键字显示出该文件的绝对路径,并询问用户,是否删除文件,如果是,输入 y ,如果不删除文件,则输入 n 。
//            根据输入的字符,选择是否删除文件
if (input.equalsIgnoreCase("y")) {
    file.delete();
    System.out.println("文件已删除!");
}else {
    System.out.println("您选择不删除文件!");
    return;
}
  1. 该文件的文件名不包含关键字,结束该方法。
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;
            }
        }
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到