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

批量操作文件功能-课后程序(JAVA基础案例教程-黑马程序员编著-第七章-课后作业)

【实验7-1】  批量操作文件功能

任务介绍

1.任务描述

在日常工作中,经常会遇到批量操作系统文件的事情,通常情况下,只能手动重复的完成批量文件的操作,这样很是费时费力。本案例要求编写一个文件管理器,实现文件的批量操作。文件管理器具体功能要求如下:

  1. 用户输入指令1,代表“指定关键字检索文件”,此时需要用户输入检索的目录和关键字,系统在用户指定的目录下检索出文件名中包含关键字的文件,并将其绝对路径展示出来。
  2. 用户输入指令2,代表“指定后缀名检索文件”,此时需要用户输入检索的目录和后缀名(多个后缀名用逗号分隔),系统在用户指定的目录下检索出指定后缀名的文件,并将其绝对路径展示出来。
  3. 用户输入指令3,代表“删除文件/目录”,此时需要用户输入需要删除掉的文件目录,程序执行后会将目录以及目录下的内容全部删除。
  4. 用户输入指令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

  1. package chapter070;
  2. import java.io.File;
  3. import java.util.ArrayList;
  4. import java.util.Scanner;
  5. public class DocumentManager {
  6.     public static void main(String[] args) throws Exception {
  7.         Scanner sc = new Scanner(System.in);
  8.         System.out.println("--1:指定关键字检索文件  2:指定后缀名检索文件  "
  9.                 + "3:删除文件/目录  4:退出--");
  10.         while(true){
  11.             System.out.print("请输入指令:");
  12.             int command = sc.nextInt();
  13.             switch (command) {
  14.                 case 1:
  15.                     searchByKeyWorld();//指定关键字检索文件
  16.                     break;
  17.                 case 2:
  18.                     searchBySuffix();//指定后缀名检索文件
  19.                     break;
  20.                 case 3:
  21.                     deleteDir();//删除文件/目录
  22.                     break;
  23.                 case 4:
  24.                     exit();//退出
  25.                     break;
  26.                 default:
  27.                     System.out.println("您输入的指令错误!");
  28.                     break;
  29.             }
  30.         }
  31.     }
  32.     // *********1.指定关键字检索文件*********
  33.     private static void searchByKeyWorld() {
  34.         Scanner sc = new Scanner(System.in);
  35.         System.out.print("请输入要检索的目录位置:");
  36.         String path = sc.next();//从控制台获取路径
  37.         File file = new File(path);
  38.         //判断目录是否存在,是否是目录
  39.         if (!file.exists() || !file.isDirectory()) {
  40.             System.out.println(path + " (不是有效目录)");
  41.             return;
  42.         }
  43.         System.out.print("请输入搜索关键字:");
  44.         String key = sc.next();//获取关键字
  45.         //在输入目录下获取所有包含关键字的文件路径
  46.         ArrayList<String> list = FileUtils.listFiles(file,key);
  47.         for (Object obj : list) {
  48.             System.out.println(obj);//将路径打印到控制台
  49.         }
  50.     }
  51.     // *********2.指定后缀名检索文件********//
  52.     private static void searchBySuffix() {
  53.         Scanner sc = new Scanner(System.in);
  54.         System.out.print("请输入要检索的目录位置:");
  55.         String path = sc.next();//从控制台获取路径
  56.         File file = new File(path);
  57.         //判断目录是否存在,是否是文件夹
  58.         if (!file.exists() || !file.isDirectory()) {
  59.             System.out.println(path + " (不是有效目录)");
  60.             return;
  61.         }
  62.         System.out.print("请输入搜索后缀:");
  63.         String suffix = sc.next();
  64.         String[] suffixArray = suffix.split(",");//获取后缀字符串
  65.         //在输入目录下获取所有指定后缀名的文件路径
  66.         ArrayList<String> list = FileUtils.listFiles(file, suffixArray);
  67.         for (Object obj : list) {
  68.             System.out.println(obj);//将路径打印到控制台
  69.         }
  70.     }
  71.     // *********3.删除文件/目录**********//
  72.     private  static void deleteDir() {
  73.         Scanner sc = new Scanner(System.in);
  74.         System.out.print("请输入需要删除的源目录:");
  75.         String delpath = sc.next();// 从控制台获取源路径
  76.         File dir = new File(delpath); // 创建一个代表目录的File对象
  77.         doDelete(dir);
  78.     }
  79.     private  static void doDelete(File dir){
  80.         if (dir.exists()) { // 判断传入的File对象是否存在
  81.             File[] files = dir.listFiles(); // 得到File数组
  82.             for (File file : files) { // 遍历所有的子目录和文件
  83.                 if (file.isDirectory()) {
  84.                     doDelete(file); // 如果是目录,递归调用deleteDir()
  85.                 } else {
  86.                     // 如果是文件,直接删除
  87.                     file.delete();
  88.                 }
  89.             }
  90.             // 删除完一个目录里的所有文件后,就删除这个目录
  91.             dir.delete();
  92.         }
  93.     }
  94.     // *********4.退出**********//
  95.     private static void exit() {
  96.         System.out.println("您已退出系统,谢谢使用!");
  97.         System.exit(0);
  98.     }

在文件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

  1. package chapter070;
  2. import java.io.File;
  3. import java.io.FilenameFilter;
  4. import java.util.ArrayList;
  5. public class FileUtils {
  6.     /**
  7.      * 指定关键字检索文件
  8.      * @param file File对象
  9.      * @param key  关键字
  10.      * @return 包含关键字的文件路径
  11.      */
  12.     public static ArrayList<String> listFiles(File file, final String key){
  13.         FilenameFilter filter = new FilenameFilter() { // 创建过滤器对象
  14.             // 实现accept()方法
  15.             public boolean accept(File dir, String name) {
  16.                 File currFile = new File(dir, name);
  17.                 // 如果文件名包含关键字返回true,否则返回false
  18.                 if (currFile.isFile() && name.contains(key)) {
  19.                     return true;
  20.                 }
  21.                 return false;
  22.             }
  23.         };
  24.         //递归方式获取规定的路径
  25.         ArrayList<String> arraylist = fileDir(file, filter);
  26.         return arraylist;
  27.     }
  28.     /**
  29.      * 指定后缀名检索文件
  30.      * @param file File对象
  31.      * @param suffixArray 后缀名数组
  32.      * @return 指定后缀名的文件路径
  33.      */
  34.     public static ArrayList<String> listFiles(File file,
  35.         final String[] suffixArray) {
  36.         FilenameFilter filter = new FilenameFilter() { // 创建过滤器对象
  37.             // 实现accept()方法
  38.             public boolean accept(File dir, String name) {
  39.                 File currFile = new File(dir, name);
  40.                 if (currFile.isFile()) {
  41.                     for (String suffix : suffixArray) {
  42.                         if (name.endsWith("." + suffix)) {
  43.                             return true;
  44.                         }
  45.                     }
  46.                 }
  47.                 return false;
  48.             }
  49.         };
  50.         //递归方式获取规定的路径
  51.         ArrayList<String> arraylist = fileDir(file, filter);
  52.         return arraylist;
  53.     }
  54.     /**
  55.      * 递归方式获取规定的路径
  56.      * @param dir File对象
  57.      * @param filter 过滤器
  58.      * @return 过滤器过滤后的文件路径
  59.      */
  60.     public static ArrayList<String> fileDir(File dir, FilenameFilter filter){
  61.         ArrayList<String> arraylist = new ArrayList<String>();
  62.         File[] lists = dir.listFiles(filter); // 获得过滤后的所有文件数组
  63.         for (File list : lists) {
  64.             //将文件的绝对路径放到集合中
  65.             arraylist.add(list.getAbsolutePath());
  66.         }
  67.         File[] files = dir.listFiles(); // 获得当前目录下所有文件的数组
  68.         for (File file : files) { // 遍历所有的子目录和文件
  69.             if (file.isDirectory()) {
  70.                 // 如果是目录,递归调用fileDir()
  71.                 ArrayList<String> every = fileDir(file, filter);
  72.                 arraylist.addAll(every);//将文件夹下的文件路径添加到集合中
  73.             }
  74.         }//此时的集合中有当前目录下的文件路径,和当前目录的子目录下的文件路径
  75.         return arraylist;
  76.     }
  77. }

在文件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&#xff0e;任务描述 在日常工作中&#xff0c;经常会遇到批量操作系统文件的事情&#xff0c;通常情况下&#xff0c;只能手动重复的完成批量文件的操作&#xff0c;这样很是费时费力。本案例要求编写一个文件管理器&#xff0c;…...

Hadoop3.3.1完全分布式部署

Hadoop目录Hadoop3.3.1完全分布式部署(一)1、HDFS一、安装1、基础安装1.1、配置JDK-181.2、下载并解压hadoop安装包本地运行模式测试 eg:2、完全分布式运行模式1、概要&#xff1a;2、编写集群分发脚本&#xff0c;把1~4步安装的同步到其他服务器&#xff1a;2.1、创建脚本vim …...

SpringMVC中的注解

SpringMVC中的注解 文章目录SpringMVC中的注解RequestMapping注解RequestMapping中的value属性RequestMapping中的method属性派生类PathVariable注解RequestParam注解RequestMapping注解 RequestMapping中的value属性 RequestMapping&#xff1a;既可以标识在方法上也可以标识…...

python+Vue学生作业系统 django课程在线学习网站系统

系统分为学生&#xff0c;教师&#xff0c;管理员三个角色&#xff1a; 学生功能&#xff1a; 1.学生注册登录系统 2.学生查看个人信息&#xff0c;修改个人信息 3.学生查看主页综合评价&#xff0c;查看今日值班信息 4.学生在线申请请假信息&#xff0c;查看请假的审核结果和请…...

CSS 美化网页元素【快速掌握知识点】

目录 一、为什么使用CSS 二、字体样式 三、文本样式 color属性 四、排版文本段落 五、文本修饰和垂直对齐 1、文本装饰 2、垂直对齐方式 六、文本阴影 七、超链接伪类 1、语法 2、示例 3、访问时&#xff0c;蓝色&#xff1b;访问后&#xff0c;紫色&#xff1b; …...

Tableau连接openGauss实践

目录 一、摘要 二、什么是Tableau&#xff1f; 三、安装Tableau 四、安装ODBC驱动 1、openGauss数据库 2、连接前置条件 3、Tableau连接openGauss方式一 4、Tableau连接openGauss方式二 一、摘要 Tableau可以连接到多种数据库&#xff0c;包括关系型数据库&#xff0…...

RabbitMQ 实现延迟队列

业务场景&#xff1a;1.生成订单30分钟未支付&#xff0c;则自动取消&#xff0c;我们该怎么实现呢&#xff1f;2.生成订单60秒后,给用户发短信1 安装rabbitMqwindows安装ubuntu中安装2 添加maven依赖<!-- https://mvnrepository.com/artifact/org.springframework.boot/spr…...

Spring Bean 生命周期,好像人的一生

简单说说IoC和Bean IoC&#xff0c;控制反转&#xff0c;想必大家都知道&#xff0c;所谓的控制反转&#xff0c;就是把new对象的权利交给容器&#xff0c;所有的对象都被容器控制&#xff0c;这就叫所谓的控制反转。 控制反转 Bean&#xff0c;也不是什么新鲜玩意儿&#xf…...

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.单调…...

小型水库大坝安全监测的主要对象

一、监测背景 大坝监测的目的分成两个大的方面&#xff0c;一方面是为了验证设计、指导施工、为科研提供必要的资料&#xff1b;另一方面&#xff0c;也可以说是更重要的方面&#xff0c;就是为了长期监视大坝的安全运行。因此&#xff0c;一个成功的监测设计者不仅要能充分领会…...

常见软件开源(alpha,beta等)版本介绍

一、开发期Alpha&#xff1a;是内部测试版,一般不向外部发布,会有很多Bug.一般只有测试人员使用。Beta&#xff1a;也是测试版&#xff0c;这个阶段的版本会一直加入新的功能。在Alpha版之后推出。-RC(ReleaseCandidate)&#xff1a;最终测试版本&#xff1b;可能成为最终产品的…...

凌恩生物资讯|抗性宏基因组又一力作|抗性基因+可移动元件研究新成果!

凌恩生物合作客户&#xff1a;合肥工业大学崔康平老师团队利用凌恩生物宏基因组抗性基因研究解决方案&#xff0c;对污水处理厂活性污泥中的钆&#xff08;Gd&#xff08;III&#xff09;&#xff09;和抗生素磺胺甲噁唑&#xff08;SMX&#xff09;的联合污染情况进行了调查&a…...

常见前端基础面试题(HTML,CSS,JS)(二)

ES6 新增哪些东西 箭头函数字符串模板支持模块化&#xff08;import、export&#xff09;类&#xff08;class、constructor、extends&#xff09;let、const 关键字新增一些数组、字符串等内置构造函数方法&#xff0c;例如 Array.from、Array.of 、Math.sign、Math.trunc 等…...

按关键词搜索,商品详情采集,API接口

公共参数 名称类型必须描述keyString是 调用key&#xff08;必须以GET方式拼接在URL中&#xff09; 注册Key和secret测试&#xff1a; https://o0b.cn/anzexi secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_g…...

C++的纯虚函数使用与接口实现

虚函数主要是为了父类指针访问子类同名成员方法而引入的&#xff0c;即通过重写了父类的方法&#xff0c;从而实现多态。 01 为何引入纯虚函数 对于普通虚函数&#xff0c;如果子类没有重写相应的虚函数&#xff0c;那么父类指针就只能调用父类函数实现&#xff0c;然而父类有…...

Exception has occurred: ModuleNotFoundErrorNo module named ‘urllib3‘【已解决】

问题描述 实际上只是想要测试一下torch是否安装成功&#xff0c;输出相应版本。谁知道就报错了。 Exception has occurred: ModuleNotFoundError No module named urllib3 解决方案 &#xff08;1&#xff09;使用pip或者conda卸载urllib3 pip uninstall urllib3conda unin…...

CSS 盒子模型【快速掌握知识点】

目录 一、什么是盒子模型 二、边框border-color 三、边框粗细border-width 四、边框样式border-style 五、外边距margin 六、内边距padding 七、圆角边框 八、圆形 九、盒子阴影 一、什么是盒子模型 css盒子模型又称为框模型&#xff0c;盒子的最内部是元素的实际内容…...

公网远程连接Oracle数据库【内网穿透】

文章目录1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程OracleOracle&#xff0c;是甲骨文公司的一款关系数据库管理系…...

国内售价仅10元的鸭子滑梯玩具TK卖到20美元,相关视频获400万+播放!

在TikTok上玩具一直是增速极快的一个类目&#xff0c;不同于很多其他品类在疫情期间取得了巨大增长但在疫情后销售大幅下降的现象不同&#xff0c;全球玩具市场继续表现并保持稳定的较高的销售水平。美国市场研究机构NPD的统计&#xff0c;2021年&#xff0c;全球玩具市场的销售…...

直播平台的视频美颜sdk是什么?

直播平台的视频美颜sdk是什么&#xff0c;可以做什么&#xff1f;简而言之&#xff0c;直播美颜sdk是将直播平台的视频美颜效果做成一个sdk&#xff0c;给用户提供美颜效果选择&#xff0c;同时提供不同的视频分辨率&#xff0c;可以让用户在观看直播时有更好的体验。那么具体有…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...