Java遞歸查找層級文件夾下特定內容的文件的方法
遞歸查找文件
引言
或許是文件太多,想找某個文件又忘記放哪瞭;又或者是項目改造,需要將外部調用接口進行改造,項目太多,又無法排查。那麼怎麼快速找到自己想要的內容就是一件值得思考的事情瞭。
根據特定內容尋找文件位置
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遞歸查找特定內容的文件內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java實現讀寫文件功能的代碼分享
- 正則表達式匹配${key}並在Java中使用的詳細方法
- 解決BufferedReader.readLine()遇見的坑
- 深入瞭解Java I/O 之File類
- 帶你瞭解Java的類和對象