当前位置: 首页 > 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;可以让用户在观看直播时有更好的体验。那么具体有…...

实现Vue组件库

实现Vue组件库 如何实现一个Vue组件库 Vue组件库是一种常见的前端工具&#xff0c;可以提供可复用的UI组件来简化应用程序的开发和维护。本文将介绍如何实现一个基本的Vue组件库。 步骤一&#xff1a;创建Vue项目 首先&#xff0c;我们需要使用Vue CLI创建一个Vue项目。打开…...

面试 | 移位妙解递归乘法【细节决定成败】

不用[ * ]如何使两数相乘❓一、题目明细二、思路罗列 & 代码解析1、野蛮A * B【不符合题意】2、sizeof【可借鉴】解析3、简易递归【推荐】① 解析&#xff08;递归展开图&#xff09;② 时间复杂度分析4、移位<<运算【有挑战性&#x1f4aa;】① 思路顺理② 算法图解…...

项目缓存问题处理

1、public/index.html文件头部配置 <meta http-equiv"pragram" content"no-cache"> <meta http-equiv"cache-control" content"no-cache,no-store,must-revalidate"> <meta http-equiv"expires" content&…...

DS期末复习卷(八)

一、选择题(30分) 1.字符串的长度是指&#xff08; C &#xff09;。 (A) 串中不同字符的个数 (B) 串中不同字母的个数 (C ) 串中所含字符的个数 (D) 串中不同数字的个数 2.建立一个长度为n的有序单链表的时间复杂度为&#xff08; C &#xff09; (A) O(n) (B) O(1) © …...

第50讲:SQL优化之LIMIT分页查询的优化

文章目录 1.LIMIT分页查询的优化概念2.LIMIT分页查询优化前后的效果2.1.LIMIT分页查询优化前2.2.LIMIT分页查询优化后1.LIMIT分页查询的优化概念 当表中数据量小时,分页查询基本上没有什么压力,查询速度也会很快,但是一般当表的数据量很庞大时,上千万条数据,此时分页查询…...

做独立开发者,能在AppStore赚到多少钱?

成为一名独立开发者&#xff0c;不用朝九晚五的上班&#xff0c;开发自己感兴趣的产品&#xff0c;在AppStore里赚美金&#xff0c;这可能是很多程序员的梦想&#xff0c;今天就来盘一盘&#xff0c;这个梦想实现的概率有多少。 先来了解一些数据&#xff1a; 2022年5月26日&am…...

CSS 基础【快速掌握知识点】

目录 一、什么是CSS 二、CSS发展史 三、CSS基本语法结构 1、语法 2、例如 四、style标签 五、HTML中引入CSS样式 1、行内样式 2、内部样式表 3、外部样式表 六、CSS基本选择器 1、标签选择器 2、类选择器 3、ID选择器 4、总结 5、基本选择器的优先级 七、CSS的…...

Linux 驱动基础

注册驱动模块时给模块传递参数 在一些情况下&#xff0c;我们要动态的改变驱动中某个变量的值&#xff0c;那么就可以在注册时给驱动模块传递参数。 给驱动模块中传递参数&#xff0c;需要定义好接受参数值的全局变量&#xff0c;并调用module_param 来引用它&#xff0c;具体…...

linux 共享内存操作(shm_open、mmap、编译链接库:-lz -lrt -lm -lc都是什么库)

文章目录linux 共享内存操作&#xff08;shm_open&#xff09;一、背景二、函数使用说明shm_openftruncate&#xff08;改变文件大小&#xff09;mmap共享内存三、示例代码创建内存共享文件并写入数据打开内存共享文件读数据四、问题总结shm_write.c:(.text0x18): undefined re…...

做出改变:农业科技和区块链在为地球的未来而战中的力量

到2050年&#xff0c;全球有100亿人需要养活&#xff0c;全世界都在关注区块链和农业信息化&#xff0c;以推动发展中国家的技术革新。 自成立以来&#xff0c;区块链技术已经找到了多样化和有价值的应用&#xff0c;以帮助提高效率和激励社区在不同领域和行业的参与。 农业是…...