🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## [文件查找](https://lingcoder.gitee.io/onjava8/#/book/17-Files?id=%e6%96%87%e4%bb%b6%e6%9f%a5%e6%89%be) 到目前为止,为了找到文件,我们一直使用相当粗糙的方法,在`path`上调用`toString()`,然后使用`string`操作查看结果。事实证明,`java.nio.file`有更好的解决方案:通过在`FileSystem`对象上调用`getPathMatcher()`获得一个`PathMatcher`,然后传入您感兴趣的模式。模式有两个选项:`glob`和`regex`。`glob`比较简单,实际上功能非常强大,因此您可以使用`glob`解决许多问题。如果您的问题更复杂,可以使用`regex`,这将在接下来的`Strings`一章中解释。 在这里,我们使用`glob`查找以`.tmp`或`.txt`结尾的所有`Path`: ~~~ // files/Find.java // {ExcludeFromGradle} import java.nio.file.*; public class Find { public static void main(String[] args) throws Exception { Path test = Paths.get("test"); Directories.refreshTestDir(); Directories.populateTestDir(); // Creating a *directory*, not a file: Files.createDirectory(test.resolve("dir.tmp")); PathMatcher matcher = FileSystems.getDefault() .getPathMatcher("glob:**/*.{tmp,txt}"); Files.walk(test) .filter(matcher::matches) .forEach(System.out::println); System.out.println("***************"); PathMatcher matcher2 = FileSystems.getDefault() .getPathMatcher("glob:*.tmp"); Files.walk(test) .map(Path::getFileName) .filter(matcher2::matches) .forEach(System.out::println); System.out.println("***************"); Files.walk(test) // Only look for files .filter(Files::isRegularFile) .map(Path::getFileName) .filter(matcher2::matches) .forEach(System.out::println); } } /* Output: test\bag\foo\bar\baz\5208762845883213974.tmp test\bag\foo\bar\baz\File.txt test\bar\baz\bag\foo\7918367201207778677.tmp test\bar\baz\bag\foo\File.txt test\baz\bag\foo\bar\8016595521026696632.tmp test\baz\bag\foo\bar\File.txt test\dir.tmp test\foo\bar\baz\bag\5832319279813617280.tmp test\foo\bar\baz\bag\File.txt *************** 5208762845883213974.tmp 7918367201207778677.tmp 8016595521026696632.tmp dir.tmp 5832319279813617280.tmp *************** 5208762845883213974.tmp 7918367201207778677.tmp 8016595521026696632.tmp 5832319279813617280.tmp */ ~~~ 在`matcher`中,`glob`表达式开头的`**/`表示“当前目录及所有子目录”,这在当你不仅仅要匹配当前目录下特定结尾的`Path`时非常有用。单`*`表示“任何东西”,然后是一个点,然后大括号表示一系列的可能性---我们正在寻找以`.tmp`或`.txt`结尾的东西。您可以在`getPathMatcher()`文档中找到更多详细信息。 `matcher2`只使用`*.tmp`,通常不匹配任何内容,但是添加`map()`操作会将完整路径减少到末尾的名称。 注意,在这两种情况下,输出中都会出现`dir.tmp`,即使它是一个目录而不是一个文件。要只查找文件,必须像在最后`files.walk()`中那样对其进行筛选。