Java遞歸查找層級(jí)文件夾下特定內(nèi)容的文件的方法
遞歸查找文件
引言
或許是文件太多,想找某個(gè)文件又忘記放哪了;又或者是項(xiàng)目改造,需要將外部調(diào)用接口進(jìn)行改造,項(xiàng)目太多,又無法排查。那么怎么快速找到自己想要的內(nèi)容就是一件值得思考的事情了。
根據(jù)特定內(nèi)容尋找文件位置
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";
// 需要查找的文件內(nèi)容
String content = "/queryBattle";
System.out.println("start " + new Date());
System.out.println();
// 獲取文件目錄
File filePath = new File(file);
// 獲取文件目錄下每個(gè)項(xiàng)目
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();
// 如果該文件沒有權(quán)限查看,略過
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);
}
}
}
}
}
}
}
效果如圖所示

根據(jù)文件類型和文件名關(guān)鍵字查找相關(guān)文件
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);
// 需要查找的文件內(nèi)容
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();
// 如果該文件沒有權(quán)限查看,略過
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 == "") {
// 沒有關(guān)鍵字默認(rèn)查詢指定類型的所有文件
System.out.println(metafile.getAbsolutePath());
} else {
// 如果有關(guān)鍵字就利用關(guān)鍵字查找
if (metafile.getName().contains(content)) {
System.out.println(metafile.getAbsolutePath());
}
}
}
}
}
}
}
}
效果如下

Tips
在數(shù)據(jù)量大的情況下如何高效匹配字符串就是成了一件需要解決的問題,目前用的是String的暴力匹配,對(duì)于更優(yōu)的匹配算法,像KMP算法之后也會(huì)去介紹的
到此這篇關(guān)于Java遞歸查找層級(jí)文件夾下特定內(nèi)容的文件的文章就介紹到這了,更多相關(guān)Java遞歸查找特定內(nèi)容的文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java 獲取當(dāng)前函數(shù)名的實(shí)現(xiàn)代碼
以下是對(duì)使用java獲取當(dāng)前函數(shù)名的實(shí)現(xiàn)代碼進(jìn)行了介紹。需要的朋友可以過來參考下2013-08-08
Java 根據(jù)某個(gè) key 加鎖的實(shí)現(xiàn)方式
日常開發(fā)中,有時(shí)候需要根據(jù)某個(gè) key 加鎖,確保多線程情況下,對(duì)該 key 的加鎖和解鎖之間的代碼串行執(zhí)行,這篇文章主要介紹了Java 根據(jù)某個(gè) key 加鎖的實(shí)現(xiàn)方式,需要的朋友可以參考下2023-03-03
SpringBoot整合JWT的實(shí)現(xiàn)示例
JWT是目前比較流行的跨域認(rèn)證解決方案,本文主要介紹了SpringBoot整合JWT的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
Spring?this調(diào)用當(dāng)前類方法無法攔截的示例代碼
這篇文章主要介紹了Spring?this調(diào)用當(dāng)前類方法無法攔截,通過debug 查看這個(gè)proxyService1 和this的區(qū)別,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03

