Java递归查找层级文件夹下特定内容的文件

递归查找文件

引言

或许是文件太多,想找某个文件又忘记放哪了;又或者是项目改造,需要将外部调用接口进行改造,项目太多,又无法排查。那么怎么快速找到自己想要的内容就是一件值得思考的事情了。

根据特定内容寻找文件位置

package com.lizi.globalexception.Utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Date;

public class FindFileByContent {
    public static void main(String[] args) {
        // 需要查询的目录
        String file = "D:\\zpro";

        // 需要查找的文件后缀类型
        String fileType = "java";

        // 需要查找的文件内容
        String content = "/queryBattle";

        System.out.println("start   " + new Date());
        System.out.println();

        // 获取文件目录
        File filePath = new File(file);

        // 获取文件目录下每个项目
        findContent(filePath, fileType, content);

        System.out.println();
        System.out.println("end   " + new Date());
    }

    public static void findContent(File file, String fileType, String content) {
        // 获取目录下的所有文件
        File[] files = file.listFiles();

        // 如果该文件没有权限查看,略过
        if (files == null) {
            return;
        }

        for (File metafile : files) {
            if (metafile.isDirectory()) {

                // 递归查找
                findContent(metafile, fileType, content);
            } else {
                // 获取文件名
                String name = metafile.getName();

                // 查看文件是否有后缀
                int i = name.lastIndexOf(".");
                if (i >= 0) {
                    String suffix = name.substring(i + 1);

                    // 判断后缀是否为指定的类型
                    if (suffix.equals(fileType)) {
                        try {

                            // buffer每次读取一行
                            BufferedReader bufferedReader = new BufferedReader(new FileReader(metafile.getAbsolutePath()));
                            String str;
                            while ((str = bufferedReader.readLine()) != null) {
                                if (str.contains(content)) {
                                    System.out.println(metafile.getAbsolutePath());
                                    // 只要找到一处就返回
                                    break;
                                }
                            }
                        } catch (Exception e) {
                            System.out.println(e);
                        }
                    }
                }
            }
        }
    }
}

效果如图所示

Java递归查找层级文件夹下特定内容的文件

根据文件类型和文件名关键字查找相关文件

package com.lizi.globalexception.Utils;

import java.io.File;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

public class FindLearningMaterials {
    public static void main(String[] args) {
        // 需要查询的目录
        String file = "D:\\";

        // 需要查找的文件后缀类型
        String fileType = "mp3,mp4";
        String[] split = fileType.split(",");
        List list = Arrays.asList(split);

        // 需要查找的文件内容
        String content = "";

        System.out.println("start   " + new Date());
        System.out.println();

        // 获取文件目录
        File filePath = new File(file);

        // 递归查找
        findContent(filePath, list, content);

        System.out.println();
        System.out.println("end   " + new Date());
    }

    public static void findContent(File file, List fileType, String content) {
        // 获取目录下的所有文件
        File[] files = file.listFiles();

        // 如果该文件没有权限查看,略过
        if (files == null) {
            return;
        }

        for (File metafile : files) {
            if (metafile.isDirectory()) {

                // 递归查找
                findContent(metafile, fileType, content);
            } else {
                // 获取文件名
                String name = metafile.getName();

                // 查看文件是否有后缀
                int i = name.lastIndexOf(".");
                if (i >= 0) {
                    String suffix = name.substring(i + 1);

                    // 判断后缀是否为指定的类型
                    if (fileType.contains(suffix)) {
                        if (content == "") {

                            // 没有关键字默认查询指定类型的所有文件
                            System.out.println(metafile.getAbsolutePath());
                        } else {

                            // 如果有关键字就利用关键字查找
                            if (metafile.getName().contains(content)) {
                                System.out.println(metafile.getAbsolutePath());
                            }
                        }
                    }
                }
            }
        }
    }
}

效果如下

Java递归查找层级文件夹下特定内容的文件

在数据量大的情况下如何高效匹配字符串就是成了一件需要解决的问题,目前用的是String的暴力匹配,对于更优的匹配算法,像KMP算法之后也会去介绍的

Original: https://www.cnblogs.com/yusishi/p/16380485.html
Author: 狸子橘花茶
Title: Java递归查找层级文件夹下特定内容的文件

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/586756/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • HIPPO-4J 1.3.0 正式发布:支持 Dubbo、RibbitMQ、RocketMQ 框架线程池

    文章首发在公众号(龙台的技术笔记),之后同步到个人网站:xiaomage.info Hippo-4J 距离上一个版本 1.2.1 已经过去一个月的时间。在此期间,由 8 位贡献者 …

    Java 2023年6月13日
    094
  • 简单明了的设计模式-立意篇

    1.岁月的沉淀 我们为什么要学设计模式? 如果是在我刚成为程序员的时候,我大概会这么回答: 因为设计模式是前人经验的总结,可以用来解决特定环境下,重复出现的特定问题。 同时也是程序…

    Java 2023年6月15日
    088
  • java XML标记语言

    可扩展标记语言( Extensive Markup Language),标签中的元素名是可以自己随意写,可拓展是相对于html来说 标记语言:由一对尖括号括起来 用来当做配置文件 …

    Java 2023年6月6日
    075
  • Spring Boot设置上传文件大小

    原文地址:http://t.zoukankan.com/jiangwz-p-9030943.html 可以使用配置文件配置,也可以使用Bean在启动类中配置 配置文件为applic…

    Java 2023年5月30日
    069
  • 第七周总结-vue脚手架整合SSM-路由配置

    使用axios异步 用户列表 编号 姓名 年&#x9F…

    Java 2023年6月7日
    0105
  • 二叉树的基本操作(C语言版)

    今天走进数据结构之二叉树 二叉树的基本操作(C 语言版) 1 二叉树的定义 二叉树的图长这样: 二叉树是每个结点最多有两个子树的树结构,常被用于实现二叉查找树和二叉堆。二叉树是链式…

    Java 2023年6月7日
    082
  • Java Date 和 Calendar 实例

    Java 之 Date 和 Calendar 实例 package com.homer.learn; import java.text.DateFormat; import jav…

    Java 2023年5月29日
    066
  • SpringCloud Gateway 整合Springfox/SwaggerUI3 之后调用某一个服务的接口时,请求路径不会加上对应的服务名问题

    写在前边 问题描述 解决方案 效果 我的swagger配置 写在前边 当你看到&#x…

    Java 2023年6月13日
    083
  • 学习进度报告

    学习进度汇报 姓名 李源淇 所学课程 网站的设计与开发 学习内容 在这接近一个月的时间里,我学习了中国大学MOOC网站上的南昌大学杨选辉副教授的《网站的设计与开发》这门课程。基本了…

    Java 2023年6月6日
    076
  • 快速排序与堆排序

    一、快速排序 1.快速排序是利用递归思想的一个分治排序算法,时间复杂度为O(n * logn)。对数组nums[l……r]进行快速排序的方法如下: (1)确…

    Java 2023年6月13日
    090
  • springboot集成websocket的两种实现方式

    WebSocket跟常规的http协议的区别和优缺点这里大概描述一下 一、websocket与http http协议是用在应用层的协议,他是基于tcp协议的,http协议建立链接也…

    Java 2023年5月30日
    087
  • 【力扣】1720. 解码异或后的数组

    未知 整数数组 arr 由 n 个非负整数组成。 经编码后变为长度为 n – 1 的另一个整数数组 encoded ,其中 encoded[i] = arr[i] XO…

    Java 2023年6月8日
    078
  • PDF转换OFD(Java实用版)

    前言: 在项目中用到了,就写一下哈 OFD简介 百度百科:https://baike.baidu.com/item/OFD/56227163?fr=aladdin OFD(Open…

    Java 2023年6月8日
    092
  • 排序算法(2)

    排序算法1中,对于选择排序和插入排序进行了介绍,通过代码,可以看出,假设有一个给定的乱序数组,插入排序因为都只能通过交换相邻的元素,于是得到的时间复杂度是相对来说比较高的。从这也可…

    Java 2023年6月5日
    080
  • idea指定springboot运行配置文件

    博主首页 posted @2022-07-14 14:12 笑~笑 阅读(11 ) 评论() 编辑 Original: https://www.cnblogs.com/qq3763…

    Java 2023年5月29日
    088
  • idea自动提示功能消失解决方法

    idea自动提示功能消失解决方法 ​ 在使用idea工具时可能会基于各种各样的原因导致配置文件中没有提示,这个很让人头疼,所以配置文件自动提示功能消失了怎么解决呢。 ​ 在了解如何…

    Java 2023年6月5日
    0129
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球