Java遞歸查找層級文件夾下特定內容的文件

来源:https://www.cnblogs.com/yusishi/archive/2022/06/16/16380485.html
-Advertisement-
Play Games

遞歸查找文件 引言 或許是文件太多,想找某個文件又忘記放哪了;又或者是項目改造,需要將外部調用介面進行改造,項目太多,又無法排查。那麼怎麼快速找到自己想要的內容就是一件值得思考的事情了。 根據特定內容尋找文件位置 package com.lizi.globalexception.Utils; imp ...


遞歸查找文件

引言

或許是文件太多,想找某個文件又忘記放哪了;又或者是項目改造,需要將外部調用介面進行改造,項目太多,又無法排查。那麼怎麼快速找到自己想要的內容就是一件值得思考的事情了。

根據特定內容尋找文件位置

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);
                        }
                    }
                }
            }
        }
    }
}

效果如圖所示
image

根據文件類型和文件名關鍵字查找相關文件

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());
                            }
                        }
                    }
                }
            }
        }
    }
}

效果如下
image

Tips

在數據量大的情況下如何高效匹配字元串就是成了一件需要解決的問題,目前用的是String的暴力匹配,對於更優的匹配演算法,像KMP演算法之後也會去介紹的

本文來自博客園,作者:狸子橘花茶,轉載請註明原文鏈接:https://www.cnblogs.com/yusishi/p/16380485.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在開始集成 ZEGO Express SDK 前,請確保開發環境滿足以下要求 ...
  • reduce 的學習方法 array.reduce(callback(prev, currentValue, index, arr), initialValue) //簡寫就是下麵這樣的 arr.reduce(callback,[initialValue]) callback (執行數組中每個值的函 ...
  • 基礎類型 TypeScript 支持與 JavaScript 幾乎相同的數據類型,此外還提供了實用的枚舉類型方便我們使用。 布爾值 最基本的數據類型就是簡單的true/false值,在JavaScript和TypeScript里叫做boolean(其它語言中也一樣) let isDone: bool ...
  • 行業測試數據-案例分享 一 總體介紹 “人類正從IT時代走向DT時代” 1.數據測試指的是檢查局部數據結構時為了保證臨時存儲在模塊內的數據在程式執行過程中完整、正確的過程。2.工程師開發完成後,常常需要製造大批量的偽數據,來測試數據中台的開發效果。例如在數倉開發中,會遇到需要在已構建的數倉模型(各種 ...
  • 這裡給大家分享我在網上總結出來的一些JavaScript 知識,希望對大家有所幫助 一、日期處理 1. 檢查日期是否有效 該方法用於檢測給出的日期是否有效: const isDateValid = (...val) => !Number.isNaN(new Date(...val).valueOf( ...
  • 來源 tree-shaking 最早由 Rich Harris 在 rollup 中提出。 為了減少最終構建體積而誕生。 以下是 MDN 中的說明: tree-shaking 是一個通常用於描述移除 JavaScript 上下文中的未引用代碼(dead-code) 行為的術語。 它依賴於 ES201 ...
  • 簡介 在 JavaScript 中,迭代器是一個對象,它定義一個序列,併在終止時可能返回一個返回值。 更具體地說,迭代器是通過使用 next() 方法實現迭代器協議的任何一個對象,該方法返回具有兩個屬性的對象: value,這是序列中的 next 值;和 done ,如果已經迭代到序列中的最後一個值 ...
  • 1. Express框架是什麼 1.1 Express是一個基於Node平臺的web應用開發框架,它提供了一系列的強大特性,幫助你創建各種Web應用。我們可以使用 npm install express 命令進行下載。 1.2 Express初體驗 // 引入express框架 const expr ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...