前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >杨校老师课堂之基于File类的文件管理器

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

作者头像
杨校
发布2023-03-10 11:21:19
2730
发布2023-03-10 11:21:19
举报
文章被收录于专栏:Java技术分享圈Java技术分享圈

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

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

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

工具类:

代码语言:javascript
复制
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;
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档