当前位置: 首页 > news >正文

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

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

文章目录

    • 题目描述:扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件
    • 结果案例演示:
      • 结果演示一:输入一个非目录的路径
      • 结果演示二:(输入一个所有文件都不包含的关键字)
      • 结果演示三:(输入关键字,选择是否删除文件)
    • 设计思路
      • 总体的思路
      • 使用代码,分步实现
        • 1. 准备工作(输入目录路径,创建File对象,判断,输入关键字)
        • 2. 开始遍历目录
        • 3. 实现scanDir方法
          • 3.1 获取到目录中的所有文件(File对象),同时,判断该目录是否为一个空目录
          • 3.2 遍历当前目录中的内容,然后判断当前文件时普通文件还是目录,两种情况:
            • 3.2.1 如果是普通文件,则调用deleteFile方法,进行判定并选择删除操作
            • 3.2.2 如果是目录,则递归调用本方法
    • 完整代码

例如:输入你要搜索的目录,然后在你 指定的目录中进行 循环遍历所有文件,找到 含有指定字符的文件,然后输入 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;}}}
}
http://www.xdnf.cn/news/743527.html

相关文章:

  • antddesign使用iconfont的字体库和图标库
  • 微服务中引入公共拦截器
  • python从零开始实现四极场离子轨迹仿真——框架
  • 深入理解设计模式之访问者模式
  • 帕金森带来的生活困境
  • Centos系统搭建主备DNS服务
  • Java 数据处理 - 数值转不同进制的字符串(数值转十进制字符串、数值转二进制字符串、数值转八进制字符串、数值转十六进制字符串)
  • 【Bluedriod】蓝牙协议栈GD模块(GD_SHIM_MODULE)启动机制及源码解析
  • LXQt修改开始菜单高亮
  • 第12讲、Odoo 18 权限控制机制详解
  • kafka核心组件
  • Java数据结构之ArrayList(如果想知道Java中有关ArrayList的知识点,那么只看这一篇就足够了!)
  • MySql(九)
  • 【stm32开发板】单片机最小系统原理图设计
  • 基于大模型的数据库MCP Server设计与实现
  • 自动驾驶系统研发系列—端到端自动驾驶:愿景、陷阱与现实博弈
  • 跟单业务并发量分析
  • MonitorSDK_性能监控(从Web Vital性能指标、PerformanceObserver API和具体代码实现)
  • vue3 el-input type=“textarea“ 字体样式 及高度设置
  • 《Effective Python》第六章 推导式和生成器——避免在推导式中使用超过两个控制子表达式
  • 生活小记啊
  • 核心机制三:连接管理(三次握手)
  • Ollama:本地大模型推理与应用的创新平台
  • 2025年- H62-Lc170--34.在排序数组中查找元素的第一个和最后一个位置(2次二分查找,标记向左寻找,标记向右寻找)--Java版
  • 记一次idea中lombok无法使用的解决方案
  • 设计模式——简单工厂模式(创建型)
  • 【深度学习】16. Deep Generative Models:生成对抗网络(GAN)
  • Windows上用FFmpeg采集摄像头推流 → MediaMTX服务器转发流 → WSL2上拉流播放
  • GIS常见数据及主要应用综述:类型解析、应用案例与未来趋势全景解读
  • 通过mqtt 发布温湿度