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

网友投稿 287 2022-07-23


目录递归查找文件引言根据特定内容寻找文件位置根据文件类型和文件名关键字查找相关文件Tips

递归查找文件

引言

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

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

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 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());

}

}

}

}

}

}

}

}

效果如下

Tips

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:springboot项目启动后执行方法的三种方式
下一篇:FeignClient服务器抛出异常客户端处理方案
相关文章

 发表评论

暂时没有评论,来抢沙发吧~