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


93

假设标准的Maven设置。

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

在Java中,如何获取文件的绝对路径?


您想编写一个Maven插件吗?还是在程序执行时要访问文件?
Gyro Gearless 2013年


根据情况,有三种解决方案:stackoverflow.com/a/56327069/715269
Gangnus,

Answers:


72

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

8
有限使用的建议,因为它依赖于工作目录作为Maven根目录。即使这样,您还是应该使用它target/classes/abc.txt来引用该文件,因为这是Maven处理后放置资源文件的规范位置(例如,maven-resources插件可能已对abc.txt进行了属性替换)。最好通过类路径中的getResource()使用abc.txt。
Gyro Gearless 2013年

2
如果最终用户将您的应用程序作为可执行JAR运行,该怎么办?然后,将根本没有物理文件。这是为什么您应该使用getResource()的另一个原因,例如,根据您要使用的内容打开输入流。
Matthew Wise 2014年

6
可以删除它作为正确答案吗?@Karol S在下面回答-这应该是正确的答案(因此出现差异)
DanGordon

3
错误的答案。请参考下面的答案被@Karol
bhathiya -佩雷拉

167

实际有效的正确方法是:

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

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

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


5
或者大概您可以做:(new File(resource.toURI()).getAbsolutePath();即,我认为您不需要Path对象?)
Dan King

1
关于toURI()的一个很好的技巧,这避免了路径中的空格以%20的形式出现!
Matthew Wise 2014年

29
谢谢!这几乎对我有用。但是我必须做一个更改:YourClass.class.getClassLoader()。getResource(“ abc”);
yngwietiger 2015年

new File(YourClass.class.getResource("abc").toURI().getPath())如果愿意,您也可以选择做。
Mike Rylander

2
我不明白这是如何在没有开始斜线的情况下对这么多人.getResource("/abc")
起作用的

28

您需要指定路径从 /

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

12

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

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

1

返回文件或文件路径

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

0

通往绝对路径的过程中存在两个问题:

  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/

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.