如何获取文件的文件路径

时间:2015-11-29 02:14:39

标签: java filepath

如果我已经有一个现有文件,并且我想仅使用其名称知道它的路径,我该怎么做?

我有以下代码,但它返回文件的名称,即使它不存在:

PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:**.{java,class}");

Path filename = Paths.get("Go,mvDep.java");
if (matcher.matches(filename)) {
    System.out.println(filename);
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我认为您混淆的核心是Path并不一定代表您计算机上的文件。它只是一个Java对象,表示文件系统中的概念对象。就像你可以在不知道任何名为“John Smith”的人的情况下构建new Person("John", "Smith")一样,无论文件是否存在于给定位置,都可以构造Path

获得Path之后,您可以使用Files.exists()检查是否存在,或使用Files.createFile()创建它。一般来说,Files类允许您检查和使用Path表示的实际文件系统对象。

PathMatcher的意图同样与实际文件系统断开连接;存在以确定给定的Path是否符合PathMatcher的模式 - 它基本上是Path特定的正则表达式引擎。

那么你的代码实际上是在做什么:

  1. 创建glob,该working directory将匹配以.java.class结尾的任何路径(无论此路径是否存在于任何地方)。
  2. 构建名为Path的文件的相对Go,mvDep.java。隐含地,此路径相对于当前Path.resolve(),但您可以将其传递给Files.find()以创建引用不同位置的文件的新Path
  3. 检查路径Go,mvDep.java是否与您的glob匹配,因为它以.java结束,所以它会打印路径。
  4. 听起来你真正想要的是找到一个名为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)