批量操作文件功能-课后程序(JAVA基础案例教程-黑马程序员编著-第七章-课后作业)
【实验7-1】 批量操作文件功能
任务介绍
1.任务描述
在日常工作中,经常会遇到批量操作系统文件的事情,通常情况下,只能手动重复的完成批量文件的操作,这样很是费时费力。本案例要求编写一个文件管理器,实现文件的批量操作。文件管理器具体功能要求如下:
- 用户输入指令1,代表“指定关键字检索文件”,此时需要用户输入检索的目录和关键字,系统在用户指定的目录下检索出文件名中包含关键字的文件,并将其绝对路径展示出来。
- 用户输入指令2,代表“指定后缀名检索文件”,此时需要用户输入检索的目录和后缀名(多个后缀名用逗号分隔),系统在用户指定的目录下检索出指定后缀名的文件,并将其绝对路径展示出来。
- 用户输入指令3,代表“删除文件/目录”,此时需要用户输入需要删除掉的文件目录,程序执行后会将目录以及目录下的内容全部删除。
- 用户输入指令4,代表“退出”,即退出该文件管理器程序。
2.运行结果
任务运行结果如图7-1所示。

图7-1 运行结果
源路径G:\itcast下的文件,如图7-2所示。

图7-2源目录
实现思路
(1)根据任务介绍和运行结果分析可知,首先需要创建一个文件管理器类。可以在类中使用while循环实现控制台中操作指令的多次输入,并使用switch语句根据控制台输入的操作指令来判断执行什么操作。
(2)执行指令1时,代表指定关键字检索文件,即在目录下查找包含关键字的文件。执行时先要从控制台获取目录和关键字,然后将其传到后台的方法中,后台可将传入的关键字利用过滤器将其制定成“规则”,通过递归的方式遍历文件夹,在每个子文件夹下调用过滤器,来获取符合规则的文件路径的集合,并将集合返回,最后打印出来;
(3)执行指令2时,代表指定后缀名检索文件,即在目录下查找名称结尾是指定后缀的文件。执行时可以先从控制台获取目录和后缀名,然后将后缀名拆分成数组,并将数组和目录传到后台方法中。后台可用过滤器将后缀名数组循环遍历,制定成“规则”,通过递归的方式遍历文件夹,在每个子文件夹下调用过滤器,来获取符合规则的文件路径的集合,并将集合返回,最后并打印出来;
(4)执行指令3时,执行代表根据将输入的目录删除对应的文件夹。执行是先从控制台获取文件夹地址,后台先判断File对象是否存在,再使用foreach循环遍历删除文件夹下的所有文件,最后删除该文件夹;
(5)执行指令4时,执行退出该程序的操作,该操作可以通过System.exit(0)来实现。
实现代码
(1)定义DocumentManager类,具体如文件7-1所示。
文件7-1 DocumentManager.java
- package chapter070;
- import java.io.File;
- import java.util.ArrayList;
- import java.util.Scanner;
- public class DocumentManager {
- 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[] files = dir.listFiles(); // 得到File数组
- 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);
- }
在文件7-26中,第10~30行代码,通过while循环等待指令输入,并通过switch来判断执行什么动作。第33~50行执行了根据指定的关键字检索文件的动作,其中第39行代码用来判断了输入的目录是否有效。第46行代码用于调用后台方法,获取符合规则的列表。第52~70行代码执行指定后缀名检索文件,其中第64行代码将获得的后缀名字符串拆分成数组,并利用第66行代码传入后台,获取符合规则的列表。第72~93行代码的作用是将控制台输入的目标文件删除,其中第79~93行代码定义doDelete()方法,在该方法中使用foreach循环删除子目录与文件。72~78行代码定义deleteDir()方法,在该方法中调用doDelete()方法删除目录与文件。
(2)定义FileUtils类,具体如文件7-2所示。
文件7-2 FileUtils.java
- package chapter070;
- 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;
- }
- }
在文件7-27中,执行指令1时调用第12~27行的代码,其中第13~23行代码用于创建过滤器,第25行代码用于调用递归方法。执行指令2时,将调用第34~53行代码,其中第36~49行代码用于创建过滤器,其中第41~45行代码通过循环,将所有后缀名都配成了过滤规则。第51行代码调用了递归方法,此方法的代码是60~76行,方法中第62~66行代码获取当前目录下经过过滤后的文件数组,通过循环取其路径存入集合中。第68~74行代码将当前目录下内容循环,如果是文件夹则调用自身。
相关文章:
批量操作文件功能-课后程序(JAVA基础案例教程-黑马程序员编著-第七章-课后作业)
【实验7-1】 批量操作文件功能 任务介绍 1.任务描述 在日常工作中,经常会遇到批量操作系统文件的事情,通常情况下,只能手动重复的完成批量文件的操作,这样很是费时费力。本案例要求编写一个文件管理器,…...
Hadoop3.3.1完全分布式部署
Hadoop目录Hadoop3.3.1完全分布式部署(一)1、HDFS一、安装1、基础安装1.1、配置JDK-181.2、下载并解压hadoop安装包本地运行模式测试 eg:2、完全分布式运行模式1、概要:2、编写集群分发脚本,把1~4步安装的同步到其他服务器:2.1、创建脚本vim …...
SpringMVC中的注解
SpringMVC中的注解 文章目录SpringMVC中的注解RequestMapping注解RequestMapping中的value属性RequestMapping中的method属性派生类PathVariable注解RequestParam注解RequestMapping注解 RequestMapping中的value属性 RequestMapping:既可以标识在方法上也可以标识…...
python+Vue学生作业系统 django课程在线学习网站系统
系统分为学生,教师,管理员三个角色: 学生功能: 1.学生注册登录系统 2.学生查看个人信息,修改个人信息 3.学生查看主页综合评价,查看今日值班信息 4.学生在线申请请假信息,查看请假的审核结果和请…...
CSS 美化网页元素【快速掌握知识点】
目录 一、为什么使用CSS 二、字体样式 三、文本样式 color属性 四、排版文本段落 五、文本修饰和垂直对齐 1、文本装饰 2、垂直对齐方式 六、文本阴影 七、超链接伪类 1、语法 2、示例 3、访问时,蓝色;访问后,紫色; …...
Tableau连接openGauss实践
目录 一、摘要 二、什么是Tableau? 三、安装Tableau 四、安装ODBC驱动 1、openGauss数据库 2、连接前置条件 3、Tableau连接openGauss方式一 4、Tableau连接openGauss方式二 一、摘要 Tableau可以连接到多种数据库,包括关系型数据库࿰…...
RabbitMQ 实现延迟队列
业务场景:1.生成订单30分钟未支付,则自动取消,我们该怎么实现呢?2.生成订单60秒后,给用户发短信1 安装rabbitMqwindows安装ubuntu中安装2 添加maven依赖<!-- https://mvnrepository.com/artifact/org.springframework.boot/spr…...
Spring Bean 生命周期,好像人的一生
简单说说IoC和Bean IoC,控制反转,想必大家都知道,所谓的控制反转,就是把new对象的权利交给容器,所有的对象都被容器控制,这就叫所谓的控制反转。 控制反转 Bean,也不是什么新鲜玩意儿…...
C++算法基础课 05 —— 数据结构1_单链表/双链表/栈/单调栈/队列/单调队列/KMP
文章目录 1. 单链表(用数组模拟链表)1.1 模板1.1.1 插入操作1.1.2 删除操作1.2 习题1 —— 826.单链表2. 双链表2.1 模板2.1.1 插入操作2.1.2 删除操作2.2 习题1 —— 827.双链表3. 栈(用数组模拟栈)3.1 模板3.2 习题1 —— 828.模拟栈4. 单调栈4.1 模板4.2 习题1 —— 830.单调…...
小型水库大坝安全监测的主要对象
一、监测背景 大坝监测的目的分成两个大的方面,一方面是为了验证设计、指导施工、为科研提供必要的资料;另一方面,也可以说是更重要的方面,就是为了长期监视大坝的安全运行。因此,一个成功的监测设计者不仅要能充分领会…...
常见软件开源(alpha,beta等)版本介绍
一、开发期Alpha:是内部测试版,一般不向外部发布,会有很多Bug.一般只有测试人员使用。Beta:也是测试版,这个阶段的版本会一直加入新的功能。在Alpha版之后推出。-RC(ReleaseCandidate):最终测试版本;可能成为最终产品的…...
凌恩生物资讯|抗性宏基因组又一力作|抗性基因+可移动元件研究新成果!
凌恩生物合作客户:合肥工业大学崔康平老师团队利用凌恩生物宏基因组抗性基因研究解决方案,对污水处理厂活性污泥中的钆(Gd(III))和抗生素磺胺甲噁唑(SMX)的联合污染情况进行了调查&a…...
常见前端基础面试题(HTML,CSS,JS)(二)
ES6 新增哪些东西 箭头函数字符串模板支持模块化(import、export)类(class、constructor、extends)let、const 关键字新增一些数组、字符串等内置构造函数方法,例如 Array.from、Array.of 、Math.sign、Math.trunc 等…...
按关键词搜索,商品详情采集,API接口
公共参数 名称类型必须描述keyString是 调用key(必须以GET方式拼接在URL中) 注册Key和secret测试: https://o0b.cn/anzexi secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_g…...
C++的纯虚函数使用与接口实现
虚函数主要是为了父类指针访问子类同名成员方法而引入的,即通过重写了父类的方法,从而实现多态。 01 为何引入纯虚函数 对于普通虚函数,如果子类没有重写相应的虚函数,那么父类指针就只能调用父类函数实现,然而父类有…...
Exception has occurred: ModuleNotFoundErrorNo module named ‘urllib3‘【已解决】
问题描述 实际上只是想要测试一下torch是否安装成功,输出相应版本。谁知道就报错了。 Exception has occurred: ModuleNotFoundError No module named urllib3 解决方案 (1)使用pip或者conda卸载urllib3 pip uninstall urllib3conda unin…...
CSS 盒子模型【快速掌握知识点】
目录 一、什么是盒子模型 二、边框border-color 三、边框粗细border-width 四、边框样式border-style 五、外边距margin 六、内边距padding 七、圆角边框 八、圆形 九、盒子阴影 一、什么是盒子模型 css盒子模型又称为框模型,盒子的最内部是元素的实际内容…...
公网远程连接Oracle数据库【内网穿透】
文章目录1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程OracleOracle,是甲骨文公司的一款关系数据库管理系…...
国内售价仅10元的鸭子滑梯玩具TK卖到20美元,相关视频获400万+播放!
在TikTok上玩具一直是增速极快的一个类目,不同于很多其他品类在疫情期间取得了巨大增长但在疫情后销售大幅下降的现象不同,全球玩具市场继续表现并保持稳定的较高的销售水平。美国市场研究机构NPD的统计,2021年,全球玩具市场的销售…...
直播平台的视频美颜sdk是什么?
直播平台的视频美颜sdk是什么,可以做什么?简而言之,直播美颜sdk是将直播平台的视频美颜效果做成一个sdk,给用户提供美颜效果选择,同时提供不同的视频分辨率,可以让用户在观看直播时有更好的体验。那么具体有…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
