1. 概述

在这个教程中,我们将学习如何在Java中使用通配符字符串查找文件。

2. 引言

在编程领域,**glob是一种包含通配符的模式,用于匹配文件名**。我们将使用glob模式来过滤文件名列表。我们将使用流行的通配符“*”和“?”。自Java SE 7以来,Java就已经支持这个特性。

*Java在其FileSystem类中提供了getPathMatcher()*方法。它可以接受正则表达式(regex)或glob模式。**由于与正则表达式相比,应用通配符更简单,我们将在本例中使用glob模式。

让我们看一个使用此方法和glob模式的示例:

String pattern = "myCustomPattern";
PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern);

以下是Java中的一些glob模式示例:

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方法来触发搜索过程。

首先,让我们创建一个名为SearchFileByWildcard的类,其中包含一个名为searchWithWc()的方法,它接受PathString模式作为参数:

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方法的实现。

现在我们已经讨论了基于通配符的文件搜索的实现,接下来让我们看看一些示例输出。我们将使用以下文件结构进行演示:

fileStructureUnix

如果我们传递一个包含"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));

4. 总结

在这个教程中,我们学习了如何在Java中使用通配符模式查找文件。

源代码可以在GitHub上找到。