递归查找文件

引言

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

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

  1. package com.lizi.globalexception.Utils;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileReader;
  5. import java.util.Date;
  6. public class FindFileByContent {
  7. public static void main(String[] args) {
  8. // 需要查询的目录
  9. String file = "D:\\zpro";
  10. // 需要查找的文件后缀类型
  11. String fileType = "java";
  12. // 需要查找的文件内容
  13. String content = "/queryBattle";
  14. System.out.println("start " + new Date());
  15. System.out.println();
  16. // 获取文件目录
  17. File filePath = new File(file);
  18. // 获取文件目录下每个项目
  19. findContent(filePath, fileType, content);
  20. System.out.println();
  21. System.out.println("end " + new Date());
  22. }
  23. public static void findContent(File file, String fileType, String content) {
  24. // 获取目录下的所有文件
  25. File[] files = file.listFiles();
  26. // 如果该文件没有权限查看,略过
  27. if (files == null) {
  28. return;
  29. }
  30. for (File metafile : files) {
  31. if (metafile.isDirectory()) {
  32. // 递归查找
  33. findContent(metafile, fileType, content);
  34. } else {
  35. // 获取文件名
  36. String name = metafile.getName();
  37. // 查看文件是否有后缀
  38. int i = name.lastIndexOf(".");
  39. if (i >= 0) {
  40. String suffix = name.substring(i + 1);
  41. // 判断后缀是否为指定的类型
  42. if (suffix.equals(fileType)) {
  43. try {
  44. // buffer每次读取一行
  45. BufferedReader bufferedReader = new BufferedReader(new FileReader(metafile.getAbsolutePath()));
  46. String str;
  47. while ((str = bufferedReader.readLine()) != null) {
  48. if (str.contains(content)) {
  49. System.out.println(metafile.getAbsolutePath());
  50. // 只要找到一处就返回
  51. break;
  52. }
  53. }
  54. } catch (Exception e) {
  55. System.out.println(e);
  56. }
  57. }
  58. }
  59. }
  60. }
  61. }
  62. }

效果如图所示

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

  1. package com.lizi.globalexception.Utils;
  2. import java.io.File;
  3. import java.util.Arrays;
  4. import java.util.Date;
  5. import java.util.List;
  6. public class FindLearningMaterials {
  7. public static void main(String[] args) {
  8. // 需要查询的目录
  9. String file = "D:\\";
  10. // 需要查找的文件后缀类型
  11. String fileType = "mp3,mp4";
  12. String[] split = fileType.split(",");
  13. List<String> list = Arrays.asList(split);
  14. // 需要查找的文件内容
  15. String content = "";
  16. System.out.println("start " + new Date());
  17. System.out.println();
  18. // 获取文件目录
  19. File filePath = new File(file);
  20. // 递归查找
  21. findContent(filePath, list, content);
  22. System.out.println();
  23. System.out.println("end " + new Date());
  24. }
  25. public static void findContent(File file, List<String> fileType, String content) {
  26. // 获取目录下的所有文件
  27. File[] files = file.listFiles();
  28. // 如果该文件没有权限查看,略过
  29. if (files == null) {
  30. return;
  31. }
  32. for (File metafile : files) {
  33. if (metafile.isDirectory()) {
  34. // 递归查找
  35. findContent(metafile, fileType, content);
  36. } else {
  37. // 获取文件名
  38. String name = metafile.getName();
  39. // 查看文件是否有后缀
  40. int i = name.lastIndexOf(".");
  41. if (i >= 0) {
  42. String suffix = name.substring(i + 1);
  43. // 判断后缀是否为指定的类型
  44. if (fileType.contains(suffix)) {
  45. if (content == "") {
  46. // 没有关键字默认查询指定类型的所有文件
  47. System.out.println(metafile.getAbsolutePath());
  48. } else {
  49. // 如果有关键字就利用关键字查找
  50. if (metafile.getName().contains(content)) {
  51. System.out.println(metafile.getAbsolutePath());
  52. }
  53. }
  54. }
  55. }
  56. }
  57. }
  58. }
  59. }

效果如下

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. javascript打印对象函数

    //js对象打印函数 function writeObj(obj) { var description = ""; for (var i in obj) { var propert ...

  2. 在Centos7.3下使用Siege对Django服务进行压力测试

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_87 Siege是linux下的一个web系统的压力测试工具,支持多链接,支持get和post请求,可以对web系统进行多并发下持续 ...

  3. 【原创】Python 网易易盾滑块验证

    本文仅供学习交流使用,如侵立删! 记一次 网易易盾滑块验证分析并通过 操作环境 win10 . mac Python3.9 selenium.PIL.numpy.scipy.matplotlib 分析 ...

  4. 活动回顾丨ALC Beijing 首场 Meetup:《开源到底有多难?》

    8月16日,ALC Beijing 的首次线下沙龙活动 -- <开源到底有多难?>在微软大厦如期举行.本次沙龙主要是分享开源开发经验.探讨如何让开源项目更加茁壮成长,以及分享 ASF 管理 ...

  5. Luogu1083 借教室 (线段树)

    当根都<0,就不行了 #include <iostream> #include <cstdio> #include <cstring> #include &l ...

  6. iommu分析之---smmu v3的实现

    smmu 除了完成 iommu 的统一的ops 之外,有自己独特的一些地方. 1.Stream Table Stream Table是存在内存中的一张表,在SMMU设备初始化的时候由驱动程序创建好. ...

  7. 洛谷P4135 作诗(不一样的分块)

    题面 给定一个长度为 n n n 的整数序列 A A A ,序列中每个数在 [ 1 , c ] [1,c] [1,c] 范围内.有 m m m 次询问,每次询问查询一个区间 [ l , r ] [l, ...

  8. LOJ6077「2017 山东一轮集训 Day7」逆序对 (生成函数+多项式exp?朴素DP!)

    题面 给定 n , k n,k n,k ,求长度为 n n n 逆序对个数为 k k k 的排列个数,对 1 e 9 + 7 \rm1e9+7 1e9+7 取模. 1 ≤ n , k ≤ 100   ...

  9. 硬件IIC驱动原理

    1.IIC物理层 IIC通信属于同步半双工通信,IIC总线由两根信号线组成.一根是数据线SDA,一根是时钟线SCL,时钟线只能由主机发送给从机,数据线可以双向进行通信,总线上可挂载多个设备,挂载数量受 ...

  10. logstash接受checkpoint防火墙日志并用ruby分词

    直接上logstahs配置文件 input{ syslog{ type => "syslog" port => 514 } } filter { grok { matc ...