在 Java 中查找與通配符字符串匹配的文件
- java
一、概述
在本教程中,我們將學習如何在 Java 中使用通配符字符串查找文件。
2. 簡介
在編程領域, glob 是一種帶有通配符來匹配文件名的模式。我們將使用 glob 模式來過濾我們示例的文件名列表。我們將使用流行的通配符“*”和“?”。 Java 從 Java SE 7 開始就支持這個特性。
Java 在其FileSystem
類中提供了getPathMatcher()
方法。它可以採用正則表達式 (regex) 或 glob 模式。我們將在此示例中使用 glob 模式,因為與正則表達式相比,應用通配符更簡單。
讓我們看一個將此方法與 glob 模式一起使用的示例:
String pattern = "myCustomPattern";
PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern);
以下是 Java 中 glob 模式的一些示例:
全球 | 描述 |
---|---|
*.java | 匹配所有擴展名為“java”的文件 |
*.{java,class} | 匹配所有帶有“java”或“class”擴展名的文件 |
*.* | 匹配所有帶有“.”的文件某處以它的名義 |
??? | 匹配名稱中包含四個字符的所有文件 |
[test].docx | 匹配文件名為“t”、“e”、“s”或“t”且擴展名為“docx”的所有文件 |
[0-4].csv | 匹配文件名為“0”、“1”、“2”、“3”或“4”且擴展名為“csv”的所有文件 |
C:\\temp\\* | 匹配 Windows 系統上“C:\temp”目錄中的所有文件 |
src/test/* | 在基於 Unix 的系統上匹配“src/test/”目錄中的所有文件 |
3. 實施
讓我們詳細了解實現此解決方案的細節。完成此任務有兩個步驟。
首先,我們創建一個帶有兩個參數的方法——一個要在其中搜索的根目錄和一個要查找的通配符模式。此方法將包含用於訪問每個文件和目錄、利用 glob 模式並最終返回匹配文件名列表的編程邏輯。
其次,我們使用 Java 提供的Files
類中的walkFileTree
方法來調用我們的搜索過程。
首先,讓我們使用searchWithWc()
方法創建SearchFileByWildcard
類,該方法接受Path
和String
模式作為參數:
class SearchFileByWildcard {
static List<String> matchesList = new ArrayList<String>();
List<String> searchWithWc(Path rootDir, String pattern) throws IOException {
matchesList.clear();
FileVisitor<Path> matcherVisitor = new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attribs) throws IOException {
FileSystem fs = FileSystems.getDefault();
PathMatcher matcher = fs.getPathMatcher(pattern);
Path name = file.getFileName();
if (matcher.matches(name)) {
matchesList.add(name.toString);
}
return FileVisitResult.CONTINUE;
}
};
Files.walkFileTree(rootDir, matcherVisitor);
return matchesList;
}
}
要訪問rootDir
中的文件,我們使用FileVisitor
接口。一旦我們通過調用getDefault()
方法獲得到文件系統的接口,我們就使用FileSystem
類的getPathMatcher()
方法。這是我們在rootDir
中的單個文件路徑上應用 glob 模式的地方。
在我們的例子中,我們可以使用生成的PathMatcher
來獲取匹配文件名的ArrayList
。
最後,我們從 NIO Files
類中調用walkFileTree
方法。文件遍歷從rootDir
開始,樹中的每個節點都以深度優先的方式遞歸訪問。 matcherVisitor
包含SimpleFileVisitor
類中visitFile
方法的實現。
現在我們已經討論了實現基於通配符的文件搜索,讓我們看一些示例輸出。我們將在示例中使用以下文件結構:
如果我們傳遞一個帶有“glob:*.{txt,docx}”
模式的String
,我們的代碼會輸出三個擴展名為“txt”
的文件名和一個擴展名為“docx”
的文件名:
SearchFileByWildcard sfbw = new SearchFileByWildcard();
List<String> actual = sfbw.searchWithWc(Paths.get("src/test/resources/sfbw"), "glob:*.{txt,docx}");
assertEquals(new HashSet<>(Arrays.asList("six.txt", "three.txt", "two.docx", "one.txt")),
new HashSet<>(actual));
如果我們傳遞一個帶有“glob:????.{csv}”
模式的String
,我們的代碼會輸出一個文件名,其中包含四個字符後跟一個“.”。擴展名為“csv”
:
SearchFileByWildcard sfbw = new SearchFileByWildcard();
List<String> actual = sfbw.searchWithWc(Paths.get("src/test/resources/sfbw"), "glob:????.{csv}");
assertEquals(new HashSet<>(Arrays.asList("five.csv")), new HashSet<>(actual));