【问题标题】:How to get the file path of a file如何获取文件的文件路径
【发布时间】:2015-11-29 02:14:39
【问题描述】:

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

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

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

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

感谢您的帮助!

【问题讨论】:

  • 你是什么意思即使它不存在?存在于哪里?你的意思是在文件系统上?您认为代码的哪一部分应该检查文件是否存在?你为什么这么认为?
  • 是的,我的意思是在文件系统中。我明白你在说什么。但是有没有一种方法,给定一个文件名,它会通过在整个系统中搜索它来返回它的路径?

标签: java filepath


【解决方案1】:

我认为您困惑的核心是Path 不一定代表您计算机上的文件。它只是一个 Java 对象,表示文件系统中的概念对象。与您可以在不认识任何名为“John Smith”的人的情况下构建new Person("John", "Smith") 的方式相同,您可以构建Path,而不管给定位置是否存在文件。

一旦你有了Path,你可以用它做很多事情,包括通过Files.exists()检查它是否存在,或者用Files.createFile()创建它。一般来说,Files 类允许您检查和使用Path 代表的实际文件系统对象。

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

所以你的代码实际上在做的是:

  1. 创建一个glob,它将匹配任何以.java.class 结尾的路径(无论这样的路径是否存在于任何地方)。
  2. 构造一个相对的Path 到一个名为Go,mvDep.java 的文件。此路径隐含地与当前的 working directory 相关,但您可以将其传递给 Path.resolve() 以创建一个新的 Path 引用不同位置的文件。
  3. 检查路径 Go,mvDep.java 是否与您的 glob 匹配,因为它以 .java 结尾,所以它会打印路径。

听起来你真正想要的是找到一个名为Go,mvDep.java现有文件。如果是这样,您想使用Files.find() 搜索目录并返回与您定义的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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多