[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)容。