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

news2025/7/29 11:13:58

【实验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行代码将当前目录下内容循环,如果是文件夹则调用自身。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/367903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(二十六)、项目打包H5+微信小程序+app【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

1&#xff0c;打包H5发布上线到前端页面托管 1.1 上传所有DBschema和云函数 上传所有DBschema到云服务空间 上传所有云函数到云服务空间 1.2 Hbuilderx基础配置 点击manifest.json文件----web配置&#xff1a; 点击发行—H5 1.3 H5打包完成 使用vscode中的live serve…

【C语言进阶】动态内存管理详解与常见动态内存错误以及柔性数组使用与介绍

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C语言进阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1.动态内存1.1 概述…

运营级手机直播平台源码 短视频直播带货APP源码

短视频直播带货APP源码 全开源原生直播APP源码 前端&#xff1a;原生APP 安卓端&#xff1a;Java 苹果端&#xff1a;OC 后台&#xff1a;PHP 数据库&#xff1a;Mysql 技术框架&#xff1a;Thinkphp5.1 系统特色功能包括&#xff1a;礼物系统&#xff1b;提现方式&#…

2月 公司来一00后卷王,我们这帮老油条真干不过.....

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 2023年春…

【算法】——并查集

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法篇 &#x1f43e;或许会很慢&#xff0c;但是不可以停下&#x1f43e; 文章目录1.思想2.模板3.应用3.1 合并集合3.2 连通块中点的数量1.思想 并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题…

ESP32 Arduino EspNow点对点双向通讯

ESP32 Arduino EspNow点对点双向通讯✨本案例分别采用esp32和esp32C3之间点对点单播无线通讯方式。 &#x1f33f;esp32开发板 &#x1f33e;esp32c3开发板 &#x1f527;所需库(需要自行导入到Arduino IDE library文件夹中&#xff0c;无法在IDE 管理库界面搜索下载到该库)&am…

【GO】k8s 管理系统项目[前端部分16–前端布局]

【GO】k8s 管理系统项目[前端部分–前端布局] 1. 前端布局 2. Layout 2.1 layout src/layout/Layout.vue <template><div class"common-layout"><el-container><el-side width"200">Aside</el-side><el-container>…

哪些骨传导运动蓝牙耳机好,分享几款不错的骨传导耳机

​骨传导耳机在运动中有很多优势&#xff0c;它是一款不入耳的耳机&#xff0c;适合在跑步、骑行、爬山等运动中使用&#xff0c;如果你是一个爱运动的人&#xff0c;骨传导耳机是不错的选择。由于骨传导技术不需要塞入耳朵中就能听到音乐&#xff0c;所以不会产生任何不适感。…

计算机图形学期末复习笔记

计算机图形学 ch1绪论 1.1计算机图形学及其概念 计算机图形学&#xff08;Computer Graphics&#xff09;是研究怎样利用计算机来生成、处理和显示图形的原理、方法和技术的学科。 cg研究对象是图形 图形的要素 几何&#xff08;轮廓、点、线、面&#xff09;非几何要素&…

前向传播与反向传播参数的更新方式(略高于高中数学水平)(附公式、代码)

前向传播与反向传播意义及其参数的更新方式 文章目录前向传播与反向传播意义及其参数的更新方式一、前言二、前反向传播的作用三、前向传播四、反向传播代码一、前言 因为本身非科班出身&#xff0c;数学又学的很差&#xff0c;一直都是傻瓜式地用tensorflow和pytorch搭网络。…

【容器】学习docker容器网络

在前面讲解容器基础时&#xff0c;曾经提到过一个 Linux 容器能看见的“网络栈”&#xff0c;实际上是被隔离在它自己的 Network Namespace 当中的。 而所谓“网络栈”&#xff0c;就包括了&#xff1a;网卡&#xff08;Network Interface&#xff09;、回环设备&#xff08;L…

Mac mini 外接移动硬盘无法写入或者无法显示的解决方法

文章目录1. 背景2. 让NTFS格式的移动硬盘正常读写方法3. 打开“启动安全性实用工具”4. 更改“安全启动”设置1. 背景 刚买mac min&#xff08;2023年2月3日&#xff09;不久&#xff0c;发现macOS的玩起来并不容易&#xff0c;勇习惯了windows系统的习惯&#xff0c;感觉 mac…

【storybook】你需要一款能在独立环境下开发组件并生成可视化控件文档的框架吗?(二)

storybook回顾继续说说用法配置文件介绍回顾 上篇博客地址&#xff1a; https://blog.csdn.net/tuzi007a/article/details/129192502说了部分用法。 继续说说用法 配置文件介绍 开发环境的配置都在.storybook目录中&#xff0c;里面包含了2个文件 main.js preview.js先看m…

STM32 触摸屏移植GUI控制控件

目录 1、emWin 支持指针输入设备。 2、 模拟触摸屏驱动 3、实现触摸屏的流程 3.1 实现硬件函数 3.2 实现对GUI_TOUCH_Exec()的定期调用 3.3 使用上一步确定的值&#xff0c;在初始化函数LCD_X_Config&#xff08;&#xff09;当中添加对GUI_TOUCH_Calibrate()的调用 4、…

Kubernetes入门教程 --- 使用二进制安装

Kubernetes入门教程 --- 使用二进制安装1. Introduction1.1 架构图1.2 关键字介绍1.3 简述2. 使用Kubeadm Install2.1 申请三个虚拟环境2.2 准备安装环境2.3 配置yum源2.4 安装Docker2.4.1 配置docker加速器并修改成k8s驱动2.5 时间同步2.6 安装组件3. 基础知识3.1 Pod3.2 控制…

【一些回忆】2022.02.26-2023.02.26 一个普通男孩蜕变的365天

&#x1f483;&#x1f3fc; 本人简介&#xff1a;男 &#x1f476;&#x1f3fc; 年龄&#xff1a;18 &#x1f91e; 作者&#xff1a;那就叫我亮亮叭 &#x1f4d5; 专栏&#xff1a;一些回忆 为什么选择在这个时间节点回忆一下呢&#xff1f; 一是因为今天距离2023高考仅剩1…

双指针法应用总结

一、双指针法&#xff08;一&#xff09;概况1.类型&#xff1a;快慢指针&#xff08;相同方向循环&#xff09;、对撞指针&#xff08;相反方向循环&#xff09;、滑动窗口2.用途&#xff1a;提高效率&#xff0c;通常能将将O(n^2)的时间复杂度&#xff0c;降为O(n)3.可应用的…

selenium基本操作

爬虫与反爬虫之间的斗争爬虫&#xff1a;对某个网站数据或图片感兴趣&#xff0c;开始抓取网站信息&#xff1b;网站&#xff1a;请求次数频繁&#xff0c;并且访问ip固定&#xff0c;user_agent也是python&#xff0c;开始限制访问&#xff1b;爬虫&#xff1a;通过设置user_a…

数据库浅谈之 DuckDB AGG 底层实现

数据库浅谈之 DuckDB AGG 底层实现 HELLO&#xff0c;各位博友好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 这里是数据库浅谈系列&#xff0c;收录在专栏 DATABASE 中 &#x1f61c;&#x1f61c;&#x1f61c; 本系列阿呆将记录一些数据库领域相关的知…

离线维基百科阅读器Kiwix Serve

本文软件是网友 刘源 推荐的&#xff0c;因为他已经安装成功了&#xff0c;所以老苏拖拖拉拉的就从去年拖到了现在&#xff1b; &#x1f602; 什么是 Kiwix ? Kiwix 是一个用于浏览离线内容的自由开源浏览器&#xff0c;最初用于离线浏览维基百科。Kiwix 可以读取以压缩形式存…