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);
}
}
}
}
}
}
}
效果如图所示

根据文件类型和文件名关键字查找相关文件
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<String> 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<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 (fileType.contains(suffix)) {
if (content == "") {
// 没有关键字默认查询指定类型的所有文件
System.out.println(metafile.getAbsolutePath());
} else {
// 如果有关键字就利用关键字查找
if (metafile.getName().contains(content)) {
System.out.println(metafile.getAbsolutePath());
}
}
}
}
}
}
}
}
效果如下

Tips
在数据量大的情况下如何高效匹配字符串就是成了一件需要解决的问题,目前用的是String的暴力匹配,对于更优的匹配算法,像KMP算法之后也会去介绍的
Java递归查找层级文件夹下特定内容的文件的更多相关文章
- java批量解压文件夹下的所有压缩文件(.rar、.zip、.gz、.tar.gz)
// java批量解压文件夹下的所有压缩文件(.rar..zip..gz..tar.gz) 新建工具类: package com.mobile.utils; import com.github.jun ...
- 读取同一文件夹下多个txt文件中的特定内容并做统计
读取同一文件夹下多个txt文件中的特定内容并做统计 有网友在问,C#读取同一文件夹下多个txt文件中的特定内容,并把各个文本的数据做统计. 昨晚Insus.NET抽上些少时间,来实现此问题,加强自身的 ...
- 每日学习心得:SharePoint 为列表中的文件夹添加子项(文件夹)、新增指定内容类型的子项、查询列表中指定的文件夹下的内容
前言: 这里主要是针对列表中的文件下新增子项的操作,同时在新建子项时,可以为子项指定特定的内容类型,在某些时候需要查询指定的文件夹下的内容,针对这些场景都一一给力示例和说明,都是一些很小的知识点,希望 ...
- android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件
简介 XStream 是一个开源项目,一套简单实用的类库,用于序列化对象与 XML 对象之间的相互转换. 将 XML 文件内容解析为一个对象或将一个对象序列化为 XML 文件. 1.下载工具 xstr ...
- C#_IO操作_查询指定文件夹下的每个子文件夹占空间的大小
1.前言 磁盘内存用掉太多,想查那些文件夹占的内存比较大,再找出没有用的文件去删除. 2.代码 static void Main(string[] args) { while (true) { //指 ...
- linux 系统获得当前文件夹下存在的所有文件 scandir函数和struct dirent **namelist结构体[转]
linux 系统获得当前文件夹下存在的所有文件 scandir函数和struct dirent **namelist结构体 1.引用头文件#include<dirent.h> struct ...
- git 命令添加整个文件夹以及文件夹下的内容
对于一个文件夹提交到服务器上,喜欢用 git add .(后面为".") 这种情况对于一个文件夹的还是很有用的,但出现了多个不同文件夹后,要分别提交就不能这么用了, 可以使用如下指 ...
- 将文件夹下的所有csv文件存入数据库
# 股票的多因子分层回测代码实现 import os import pymysql # import datetime, time # from config import * database_ta ...
- MATLAB读取一个文件夹下的多个子文件夹中的多个指定格式的文件
MATLAB需要读取一个文件夹下的多个子文件夹中的指定格式文件,这里以读取*.JPG格式的文件为例 1.首先确定包含多个子文件夹的总文件夹 maindir = 'C:\Temp Folder'; 2. ...
随机推荐
- linux文件校验
最近在一次安装centos7程序中遇到了网速很卡的情况,不得已采用了百度云的离线下载功能,后来上传进入虚拟机内,结果遇到无法上传的情况,后来经过转码后才上传成功,详情http://www.cnblog ...
- 编译式安装MYSQL
安装所需组件 实际上只需要这四个配置即可 升级boot开始 升级结束 重新执行cmake make && make install 启动mysql 发现启动失败 #####原因:这是由 ...
- 飞书前端提到的竞态问题,在 Android 上怎么解决?
请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...
- 开发Chrome插件,实现网站自动登录
近期被一个事情困扰着,我们采购了一款软件,里面有一个数据大屏页,当登录过期后,数据就会保持原状,不再更新.和供应商反馈了很多次,都无法彻底解决数据显示的问题,没办法,自己周末在家研究,网站自动登录的事 ...
- Luogu3802 小魔女帕琪 (排列组合)
注意除数为0情况 #include <iostream> #include <cstdio> #include <cstring> #include <alg ...
- mybatis 09: 动态sql --- part1
作用 可以定义代码片段 可以进行逻辑判断 可以进行循环处理(批量处理),使条件判断更为简单 使用方式 通过mybatis中与动态sql有关的标签来实现 < sql >标签 + < i ...
- Taurus.MVC 微服务框架 入门开发教程:项目集成:2、客户端:ASP.NET Core(C#)项目集成:应用中心。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
- 生成 SSH 公钥
什么是 SSH 一般的网络服务程序,如FTP.PoP和TelNet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据.而且,这些服务程序的安全验证 ...
- Kotlin快速上手
一.Kotlin基础 1.数据类型声明 在Kotlin中要定义一个变量需要使用var关键字 //定义了一个可以修改的Int类型变量 var number = 39 如果要定义一个常量可以使用val关键 ...
- JUC锁:核心类AQS源码详解
目录 1 疑点todo和解疑 2 AbstractQueuedSynchronizer学习总结 2.1 AQS要点总结 2.2 细节分析 2.2.1 插入节点时先更新prev再更新前驱next 2.2 ...