376. Java IO API - 使用 Globbing 和自定義 Filter 過濾目錄內(nèi)容

[toc]

376. Java IO API - 使用 Globbing 和自定義 Filter 過濾目錄內(nèi)容

在實際開發(fā)中,我們經(jīng)常需要列出特定類型的文件,比如所有 .java 文件、所有子目錄,或者符合某個命名規(guī)則的文件。Java NIO 為我們提供了兩種靈活的方式:

1?? 使用 Globbing(通配符匹配)

?? 示例:列出 .java.class.jar 文件

Path dir = Paths.get("your-directory-path-here");

try (DirectoryStream<Path> stream =
     Files.newDirectoryStream(dir, "*.{java,class,jar}")) {

    for (Path entry : stream) {
        System.out.println("Matched file: " + entry.getFileName());
    }

} catch (IOException e) {
    System.err.println("Failed to read directory: " + e.getMessage());
}

? Glob 語法說明:

  • "*.java":匹配所有以 .java 結尾的文件
  • "data-??.log":匹配如 data-01.log、data-ab.log
  • "*.{java,class,jar}":匹配多個后綴的文件,類似正則中的 | 邏輯

?? Glob 是簡單的模式匹配,不支持完整正則表達式。但足以應對常見的文件過濾需求。


2?? 編寫自定義 DirectoryStream.Filter

如果 glob 無法滿足需求,比如:

  • 只列出子目錄
  • 只列出大小大于 1MB 的文件
  • 忽略隱藏文件(以 "." 開頭)

那你可以自定義一個過濾器!

?? 示例:只保留目錄條目的 Filter

DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
    @Override
    public boolean accept(Path path) throws IOException {
        return Files.isDirectory(path);
    }
};

?? 使用自定義 Filter 遍歷目錄內(nèi)容

Path dir = Paths.get("your-directory-path-here");

try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, filter)) {
    for (Path entry : stream) {
        System.out.println("Directory found: " + entry.getFileName());
    }
} catch (IOException e) {
    System.err.println("Error reading directory: " + e.getMessage());
}

??Globbing 與 自定義 Filter 的對比

對比項 Globbing 自定義 Filter
匹配方式 簡單通配符(*.txt, data-??.log 完全自定義(任意邏輯)
是否支持文件類型判斷 ? 不支持 ? 支持(如 isDirectory
復雜匹配 ? 較弱 ? 可按文件大小、日期、權限等任意條件組合
適合場景 快速過濾后綴、命名 需要高級判斷(如“所有非隱藏目錄”)

?? 小貼士:如何過濾整個文件樹?

當前例子只作用于單層目錄,如果你希望:

遞歸查找所有子目錄(例如搜索整個工程目錄下的所有 .java 文件)

? 推薦使用 Java NIO 提供的 Files.walkFileTree(...) 方法配合 FileVisitor 實現(xiàn),詳見《遍歷文件樹》部分的內(nèi)容。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容