递归查找文件
引言
或许是文件太多,想找某个文件又忘记放哪了;又或者是项目改造,需要将外部调用接口进行改造,项目太多,又无法排查。那么怎么快速找到自己想要的内容就是一件值得思考的事情了。
根据特定内容寻找文件位置
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递归查找特定内容的文件内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!