如果我已经有一个现有文件,并且我想仅使用其名称知道它的路径,我该怎么做?
我有以下代码,但它返回文件的名称,即使它不存在:
PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:**.{java,class}");
Path filename = Paths.get("Go,mvDep.java");
if (matcher.matches(filename)) {
System.out.println(filename);
}
感谢您的帮助!
答案 0 :(得分:0)
我认为您混淆的核心是Path
并不一定代表您计算机上的文件。它只是一个Java对象,表示文件系统中的概念对象。就像你可以在不知道任何名为“John Smith”的人的情况下构建new Person("John", "Smith")
一样,无论文件是否存在于给定位置,都可以构造Path
。
获得Path
之后,您可以使用Files.exists()
检查是否存在,或使用Files.createFile()
创建它。一般来说,Files
类允许您检查和使用Path
表示的实际文件系统对象。
PathMatcher
的意图同样与实际文件系统断开连接;存在以确定给定的Path
是否符合PathMatcher
的模式 - 它基本上是Path
特定的正则表达式引擎。
那么你的代码实际上是在做什么:
.java
或.class
结尾的任何路径(无论此路径是否存在于任何地方)。Path
的文件的相对Go,mvDep.java
。隐含地,此路径相对于当前Path.resolve()
,但您可以将其传递给Files.find()
以创建引用不同位置的文件的新Path
。Go,mvDep.java
是否与您的glob匹配,因为它以.java
结束,所以它会打印路径。听起来你真正想要的是找到一个名为Go,mvDep.java
的现有文件。如果是这样,您希望使用jsfiddle搜索目录并返回与您定义的BiPredicate<Path, BasicFileAttributes> matcher
匹配的文件流。您的matcher
可能如下所示:
new BiPredicate<Path, BasicFileAttributes>() {
public boolean test(Path path, BasicFileAttributes attributes) {
return matcher.matches(path);
}
}
或简单地使用Lambda语法:
(p, a) -> matcher.matches(p)