119

假设标准 Maven 设置。

说在您的资源文件夹中有一个文件abc

在Java中,我怎样才能获得文件的绝对路径?

4

6 回答 6

184

实际工作的正确方法:

URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();

现在类路径中文件的物理位置无关紧要,只要资源实际上是文件而不是 JAR 条目,就会找到它。

(看似显而易见的new File(resource.getPath())方法并不适用于所有路径!路径仍然是 URL 编码的!)

于 2014-02-05T23:56:17.000 回答
101

您可以使用ClassLoader.getResource方法来获取正确的资源。

URL res = getClass().getClassLoader().getResource("abc.txt");
File file = Paths.get(res.toURI()).toFile();
String absolutePath = file.getAbsolutePath();

或者

虽然这可能不会一直有效,但更简单的解决方案 -

您可以创建一个File对象并使用getAbsolutePath方法:

File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();
于 2013-06-27T18:56:42.117 回答
36

您需要指定路径开始于/

URL resource = YourClass.class.getResource("/abc");
Paths.get(resource.toURI()).toFile();
于 2016-12-07T11:29:49.747 回答
14

创建您需要的类的 classLoader 实例,然后您可以轻松访问文件或资源。现在您使用getPath()该类的方法访问路径。

 ClassLoader classLoader = getClass().getClassLoader();
 String path  = classLoader.getResource("chromedriver.exe").getPath();
 System.out.println(path);
于 2017-03-31T09:05:29.517 回答
4

我们在通往绝对路径的路上有两个问题:

  1. 找到的位置不是源文件所在的位置,而是类的保存位置。并且资源文件夹几乎肯定会位于项目的源文件夹中。
  2. 如果类在插件中或直接在工作区中的包中运行,则用于检索资源的相同功能的工作方式不同。

以下代码将为我们提供所有有用的路径:

    URL localPackage = this.getClass().getResource("");
    URL urlLoader = YourClassName.class.getProtectionDomain().getCodeSource().getLocation();
    String localDir = localPackage.getPath();
    String loaderDir = urlLoader.getPath();
    System.out.printf("loaderDir = %s\n localDir = %s\n", loaderDir, localDir);

这里研究了可用于资源文件夹本地化的两个函数。至于class,它可以通过任何一种方式获得,静态的或动态的。


如果项目不在插件中,则在 JUnit 中运行的代码将打印:

loaderDir = /C:.../ws/source.dir/target/test-classes/
 localDir = /C:.../ws/source.dir/target/test-classes/package/

因此,要访问 src/rest/resources,我们应该在文件树上上下移动。两种方法都可以使用。请注意,我们不能使用getResource(resourceFolderName),因为该文件夹不在目标文件夹中。我希望没有人将资源放在创建的文件夹中。


如果该类在插件中的包中,则相同测试的输出将是:

loaderDir = /C:.../ws/plugin/bin/
 localDir = /C:.../ws/plugin/bin/package/

因此,我们应该再次在文件夹树中上下移动。


最有趣的是在插件中启动包的情况。作为 JUnit 插件测试,对于我们的示例。输出是:

loaderDir = /C:.../ws/plugin/
 localDir = /package/

在这里,我们可以只结合两个函数的结果来获得绝对路径。这还不够。在它们之间,我们应该放置类包所在位置的本地路径,相对于插件文件夹。src可能,您将不得不在src/test/resource此处插入一些内容。

您可以将代码插入您的代码并查看您拥有的路径。

于 2019-05-27T13:29:17.750 回答
2

返回文件或文件路径

URL resource = YourClass.class.getResource("abc");
File file = Paths.get(resource.toURI()).toFile(); // return a file
String filepath = Paths.get(resource.toURI()).toFile().getAbsolutePath();  // return file path
于 2018-03-14T04:16:54.983 回答