如何获取项目/资源文件夹中文件的绝对路径

假设标准的 maven 设置。

假设在资源文件夹中有一个文件 abc

在 Java 中,如何得到文件的绝对路径?

340974 次浏览

可以使用 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();

真正有效的方法是:

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

现在类路径中的文件物理位置并不重要,只要资源实际上是一个文件而不是一个 JAR 条目,就可以找到它。

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

您需要指定从 /开始的路径

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

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

 ClassLoader classLoader = getClass().getClassLoader();
String path  = classLoader.getResource("chromedriver.exe").getPath();
System.out.println(path);

返回文件或文件路径

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

在我们走向绝对道路的道路上有两个问题:

  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/

这里我们只能结合 都有函数的结果得到绝对路径。这还不够。在它们之间,我们应该放置类包所在位置的本地路径,相对于插件文件夹。也许,您必须在这里插入 srcsrc/test/resource这样的内容。

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