Java遞歸查找層級(jí)文件夾下特定內(nèi)容的文件的方法
遞歸查找文件
引言
或許是文件太多,想找某個(gè)文件又忘記放哪了;又或者是項(xiàng)目改造,需要將外部調(diào)用接口進(jìn)行改造,項(xiàng)目太多,又無(wú)法排查。那么怎么快速找到自己想要的內(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(); // 如果該文件沒(méi)有權(quán)限查看,略過(guò) 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(); // 如果該文件沒(méi)有權(quán)限查看,略過(guò) 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 == "") { // 沒(méi)有關(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ù)量大的情況下如何高效匹配字符串就是成了一件需要解決的問(wèn)題,目前用的是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)行了介紹。需要的朋友可以過(guò)來(lái)參考下2013-08-08Java 根據(jù)某個(gè) key 加鎖的實(shí)現(xiàn)方式
日常開(kāi)發(fā)中,有時(shí)候需要根據(jù)某個(gè) key 加鎖,確保多線程情況下,對(duì)該 key 的加鎖和解鎖之間的代碼串行執(zhí)行,這篇文章主要介紹了Java 根據(jù)某個(gè) key 加鎖的實(shí)現(xiàn)方式,需要的朋友可以參考下2023-03-03SpringBoot整合JWT的實(shí)現(xiàn)示例
JWT是目前比較流行的跨域認(rèn)證解決方案,本文主要介紹了SpringBoot整合JWT的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Spring?this調(diào)用當(dāng)前類方法無(wú)法攔截的示例代碼
這篇文章主要介紹了Spring?this調(diào)用當(dāng)前類方法無(wú)法攔截,通過(guò)debug 查看這個(gè)proxyService1 和this的區(qū)別,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03