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

article/2025/6/20 20:57:34

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

文章目录

    • 题目描述:扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件
    • 结果案例演示:
      • 结果演示一:输入一个非目录的路径
      • 结果演示二:(输入一个所有文件都不包含的关键字)
      • 结果演示三:(输入关键字,选择是否删除文件)
    • 设计思路
      • 总体的思路
      • 使用代码,分步实现
        • 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.hkcw.cn/article/RCkJTNSGxu.shtml

相关文章

Leetcode 465. 最优账单平衡

1.题目基本信息 1.1.题目描述 给你一个表示交易的数组 transactions ,其中 transactions[i] [fromi, toi, amounti] 表示 ID fromi 的人给 ID toi 的人共计 amounti $ 。 请你计算并返回还清所有债务的最小交易笔数。 1.2.题目地址 https://leetcode.cn/pro…

【沉浸式求职学习day51】【发送邮件】【javaweb结尾】

沉浸式求职学习 邮件发送原理及实现1.概述2.简单邮件3.复杂邮件 网站注册发送邮件功能实现 邮件发送原理及实现 1.概述 传输协议 SMTP协议 发送邮件: 我们通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。POP3协议 接收邮件&#…

标题:2025海外短剧爆发年:APP+H5双端系统开发,解锁全球流量与变现新大陆

描述: 2025年出海新风口!深度解析海外短剧系统开发核心(APPH5双端),揭秘高效开发策略与商业化路径,助您抢占万亿美元市场! 全球娱乐消费模式正在剧变。2025年,海外短剧市场已从蓝海…

uni-app学习笔记十六-vue3页面生命周期(三)

uni-app官方文档页面生命周期部分位于页面 | uni-app官网。 本篇再介绍2个生命周期 1.onUnload:用于监听页面卸载。 当页面被关闭时,即页面的缓存被清掉时触发加载onUnload函数。 例如:在demo6页面点击跳转到demo4,在demo4页面回退不了到d…

钉钉红包性能优化之路

一、业务背景 请客红包、小礼物作为饿了么自研的业务产品,在钉钉的一方化入口中常驻,作为高UV、PV的toB产品,面对不同设备环境的用户,经常会偶尔得到一些用户反馈,如【页面白屏太久了】、【卡住了】等等,本…

鲲鹏Arm+麒麟V10 K8s 离线部署教程

针对鲲鹏 CPU 麒麟 V10 的离线环境,手把手教你从环境准备到应用上线,所有依赖包提前打包好,步骤写成傻瓜式操作指南。 一、环境规划# 准备至少两台机器。 架构OS作用Arm64任意,Mac 也可以下载离线包Arm64麒麟 V10单机部署 K8s…

Redis主从复制详解

概述 Redis 的主从复制(Master-Slave Replication)是实现数据备份、读写分离和水平扩展的核心机制之一。通过主从复制,一个主节点(Master)可以将数据同步到多个从节点(Slave),从节点…

16.进程间通信(二)

一、命名管道 1.概念 匿名管道解决了具有血缘关系的进程之间的通信,如果两个进程毫不相干,如何进行通信呢?通过文件,管道文件。 对于两个不同进程,打开同一路径下的同一文件,inode和文件内核缓冲区不会加载…

优化的两极:凸优化与非凸优化的理论、应用与挑战

在机器学习、工程设计、经济决策等众多领域,优化问题无处不在。而在优化理论的世界里,凸优化与非凸优化如同两个截然不同的 “王国”,各自有着独特的规则、挑战和应用场景。今天,就让我们深入探索这两个优化领域的核心差异、算法特…

day15 leetcode-hot100-29(链表8)

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) 1.暴力法 思路 (1)先获取链表的长度L (2)然后再次遍历链表到L-n的位置,直接让该指针的节点指向下下一个即可。 2.哈希表 思路 &#xff0…

rtpinsertsound:语音注入攻击!全参数详细教程!Kali Linux教程!

简介 2006年8月至9月期间,我们创建了一个用于将音频插入指定音频(即RTP)流的工具。该工具名为rtpinsertsound。 该工具已在Linux Red Hat Fedora Core 4平台(奔腾IV,2.5 GHz)上进行了测试,但预…

谷歌Stitch:AI赋能UI设计,免费高效新利器

在AI技术日新月异的今天,各大科技巨头都在不断刷新我们对智能工具的认知。最近,谷歌在其年度I/O开发者大会期间,除了那些聚光灯下的重磅发布,还悄然上线了一款令人惊喜的AI工具——Stitch。这是一款全新的、完全免费的AI驱动UI&am…

PowerBI企业运营分析——线性回归销售预测

PowerBI企业运营分析——线性回归销售预测 欢迎来到Powerbi小课堂,在竞争激烈的市场环境中,企业运营分析平台成为提升竞争力的核心工具。 该平台通过整合多源数据,实现关键指标的实时监控,从而迅速洞察业务动态,精准…

<4>, Qt窗口

目录 一,菜单栏 二,工具栏 三,状态栏 四,浮动窗口 五,对话框 一,菜单栏 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);// 创建菜单栏…

多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现

多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现 目录 多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现效果一览基本介绍…

具有离散序列建模的统一多模态大语言模型【AnyGPT】

第1章 Instruction 在人工智能领域、多模态只语言模型的发展正迎来新的篇章。传统的大型语言模型(LLM)在理解和生成人类语言方面展现出了卓越的能力,但这些能力通常局限于 文本处理。然而,现实世界是一个本质上多模态的环境,生物体通过视觉、…

嵌入式学习笔记 - STM32 HAL库以及标准库内核以及外设头文件区别问题

一 CMSIS内核驱动文件夹 标准库中CMSIS内核驱动文件夹中,仅包含两个.h文件,其中stm32f10x.h 为stm10系列底层文件如总线以及各片上外设模块寄存器地址,system_stm32f10x.h为系统底层配置文件,主要为时钟配置。 HAL库中CMSIS内核驱…

LeetCode 算 法 实 战 - - - 移 除 链 表 元 素、反 转 链 表

LeetCode 算 法 实 战 - - - 移 除 链 表 元 素、反 转 链 表 第 一 题 - - - 移 除 链 表 元 素方 法 一 - - - 原 地 删 除方 法 二 - - - 双 指 针方 法 三 - - - 尾 插 第 二 题 - - - 反 转 链 表方 法 一 - - - 迭 代方 法 二 - - - 采 用 头 插 创 建 新 链 表 总 结 &a…

Ros真(node?package?)

Ros中 都是靠一个个节点相互配合的 如同APP之间的配合 然后节点不好单独存在, 我们一般把他们放在一个包里 也就是Package。 也可以自己设立一个包 如图这种 ———————————— 建立包 流程 : —————— 我们弄好之后 在VSCODE SRC右键 …

电路图识图基础知识-常用仪表识图及接线(九)

一、 直流电流表的使用和接线 用来测量直流电流的仪表,我们称为直流电流表,下图所示为直流电流表。 直流电流表有两种接入方式:直接接入法、间接接入法。下图所示为直流电流表接线方 法 。 4.1.2 交流电流表的使用和接线 交流电流表也是一种…