遞回查找檔案
引言
或許是檔案太多,想找某個檔案又忘記放哪了;又或者是專案改造,需要將外部呼叫介面進行改造,專案太多,又無法排查,那么怎么快速找到自己想要的內容就是一件值得思考的事情了,
根據特定內容尋找檔案位置
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演算法之后也會去介紹的
本文來自博客園,作者:貍子橘花茶,轉載請注明原文鏈接:https://www.cnblogs.com/yusishi/p/16380485.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/491912.html
標籤:Java
