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

杨校老师课堂之基于File类的文件管理器

在日常工作中,经常会遇到批量操作系统文件的事情,通常情况下,只能手动重复的完成批量文件的操作,这样很是费时费力。

本案例要求编写一个文件管理器,实现文件的批量操作。
文件管理器具体功能要求如下:

  • 用户输入指令1,代表“指定关键字检索文件”,此时需要用户输入检索的目录和关键字,系统在用户指定的目录下检索出文件名中包含关键字的文件,并将其绝对路径展示出来。
  • 用户输入指令2,代表“指定后缀名检索文件”,此时需要用户输入检索的目录和后缀名(多个后缀名用逗号分隔),系统在用户指定的目录下检索出指定后缀名的文件,并将其绝对路径展示出来。
  • 用户输入指令3,代表“删除文件/目录”,此时需要用户输入需要删除掉的文件目录,程序执行后会将目录以及目录下的内容全部删除。
  • 用户输入指令4,代表“退出”,即退出该文件管理器程序。
package cn.javabs.cases;import java.io.File;
import java.util.ArrayList;
import java.util.Scanner;public class DocManager {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数组File[] files = dir.listFiles(); // 遍历所有的子目录和文件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);}
}

工具类:

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,否则返回falseif (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;}
}
http://www.lryc.cn/news/36814.html

相关文章:

  • java面试算法汇总-数组
  • Docker-Mysql主从复制
  • (模拟)1241. 外卖店优先级
  • Linux进程学习【进程地址】
  • 系统调用——文件操作相关函数
  • 做互联网自媒体创业的月薪收入真的能过万吗?
  • Kubernetes (k8s) 污点(Taint)、容忍介绍、示例
  • 多团队协作构建可观测性
  • 100种思维模型之认知资源思维模型-030
  • c/cpp - 多线程/进程 基础
  • 第55章 头像图片的前端渲染显示
  • vue2 使用 cesium 【第二篇-相机视角移动+添加模型】
  • C/C++ 操作ini文件(SinpleIni 跨平台库)
  • Cadence Allegro 导出Design Rules Check(DRC)Report报告详解
  • Java的stream流
  • Mybatis_相关配置解析和ResultMap
  • Python量化入门:利用中长期RSI寻找趋势拐点,抓大放小,蹲一个大机会!
  • 案例14-代码结构逻辑混乱,页面设计不美观
  • 弱监督参考图像分割:Learning From Box Annotations for Referring Image Segmentation论文阅读笔记
  • Linux进程和任务管理和分析和排查系统故障
  • 【满分】【华为OD机试真题2023 JAVA】最多几个直角三角形
  • PyQt5可视化 7 饼图和柱状图实操案例 ②建表建项目改布局
  • sonarqube指标详解
  • 耳机 喇叭接线分析
  • SpaceNet 建筑物检测
  • 蓝桥杯刷题第六天
  • Linux C++ 多线程高并发服务器实战项目一
  • QML ComboBox简介
  • uniapp使用webview嵌入vue页面及通信
  • 深度学习部署笔记(九): CUDA RunTime API-2.1内存管理