递归查找文件

引言

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

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

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递归查找层级文件夹下特定内容的文件的更多相关文章

  1. java批量解压文件夹下的所有压缩文件(.rar、.zip、.gz、.tar.gz)

    // java批量解压文件夹下的所有压缩文件(.rar..zip..gz..tar.gz) 新建工具类: package com.mobile.utils; import com.github.jun ...

  2. 读取同一文件夹下多个txt文件中的特定内容并做统计

    读取同一文件夹下多个txt文件中的特定内容并做统计 有网友在问,C#读取同一文件夹下多个txt文件中的特定内容,并把各个文本的数据做统计. 昨晚Insus.NET抽上些少时间,来实现此问题,加强自身的 ...

  3. 每日学习心得:SharePoint 为列表中的文件夹添加子项(文件夹)、新增指定内容类型的子项、查询列表中指定的文件夹下的内容

    前言: 这里主要是针对列表中的文件下新增子项的操作,同时在新建子项时,可以为子项指定特定的内容类型,在某些时候需要查询指定的文件夹下的内容,针对这些场景都一一给力示例和说明,都是一些很小的知识点,希望 ...

  4. android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件

    简介 XStream 是一个开源项目,一套简单实用的类库,用于序列化对象与 XML 对象之间的相互转换. 将 XML 文件内容解析为一个对象或将一个对象序列化为 XML 文件. 1.下载工具 xstr ...

  5. C#_IO操作_查询指定文件夹下的每个子文件夹占空间的大小

    1.前言 磁盘内存用掉太多,想查那些文件夹占的内存比较大,再找出没有用的文件去删除. 2.代码 static void Main(string[] args) { while (true) { //指 ...

  6. linux 系统获得当前文件夹下存在的所有文件 scandir函数和struct dirent **namelist结构体[转]

    linux 系统获得当前文件夹下存在的所有文件 scandir函数和struct dirent **namelist结构体 1.引用头文件#include<dirent.h> struct ...

  7. git 命令添加整个文件夹以及文件夹下的内容

    对于一个文件夹提交到服务器上,喜欢用 git add .(后面为".") 这种情况对于一个文件夹的还是很有用的,但出现了多个不同文件夹后,要分别提交就不能这么用了, 可以使用如下指 ...

  8. 将文件夹下的所有csv文件存入数据库

    # 股票的多因子分层回测代码实现 import os import pymysql # import datetime, time # from config import * database_ta ...

  9. MATLAB读取一个文件夹下的多个子文件夹中的多个指定格式的文件

    MATLAB需要读取一个文件夹下的多个子文件夹中的指定格式文件,这里以读取*.JPG格式的文件为例 1.首先确定包含多个子文件夹的总文件夹 maindir = 'C:\Temp Folder'; 2. ...

随机推荐

  1. 叫高二上一调?简要题解 (ACD)

    A. 电压机制 题意转换为所有奇环的并排除掉所有偶环留下的边的个数 . 建出 DFS 树,然后只有返祖边可能构成环 . 于是类似树上差分,\(odd_u\) 统计奇环,\(even_u\) 统计偶环 ...

  2. Odoo14 防暴力破解登录密码

    1 # Odoo14 防暴力破解登录密码 2 # 主要工具:redis 3 # 实现思路:限制每个用户24小时内登录失败次数.连续超过5次失败后,需要等待一定时间后才能再次尝试登录 4 # 配置:在你 ...

  3. Odoo14 js 怎么获取图片url链接

    上内部代码: 1 _getImageURL: function (model, field, id, placeholder) { 2 id = (_.isArray(id) ? id[0] : id ...

  4. boot issue

    Q:生产过程中不小心把 boot文件删除了 ,或者升级kenerl时发现版本不兼容,需要回退,此时没有快照备份情况如何操作? A:boot 主要文件是内核和grub引导文件   修复方法: 1.进入救 ...

  5. 【原创】Selenium获取请求头、响应头

    本文仅供学习交流使用,如侵立删! Selenium获取请求头.响应头 操作环境 win10 . mac Python3.9 selenium.seleniumwire selenium是没有办法直接获 ...

  6. 不止跑路,拯救误操作rm -rf /*的小伙儿

    摘要:误执行了 rm -rf /* 之后,除了跑路还能怎么办? 本文分享自华为云社区<拯救被 rm -rf 伤到的小伙>,作者:Gauss 松鼠会. 灵魂画师再次上线   在开饭前我们先了 ...

  7. Oracle-DDL,DML理解以及应用

    SQL语句:虽然SQL语句不区分大小写,但是字符串的值时区分大小写的.SQL是结构化查询语句,操作数据库需要向数据库发送SQL语句,数据库会理解SQL语句中含义并执行SQL语句分为:DDL(数据定义语 ...

  8. 如何自定义一个Collector

    Collectors类提供了很多方便的方法,假如现有的实现不能满足需求,我们如何自定义一个Collector呢?   Collector接口提供了一个of方法,调用该方法就可以实现定制Collecto ...

  9. Linux 禁止root远程登录解决办法

    linux中root用户是超级管理员,可以针对root用户暴力破解密码,这样很不安全,工作中我们一般禁止root用户直接远程登陆,开设一个或多个普通用户,只允许登陆普通用户,如果有需要用root用户, ...

  10. 第七十二篇:Vue组件的props

    好家伙, 1.组件的props props是组件的自定义属性,在封装通用组件的时候,合理的使用props可以极大的提高组件的复用性 来假设一下,如果我们需要两个组件分别显示不同的值 目录结构如下: H ...