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

时间:2013-06-27 18:52:16

标签: java file resources

假设标准maven设置。

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

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

6 个答案:

答案 0 :(得分:141)

实际运作的正确方法:

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

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

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

答案 1 :(得分:33)

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

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

OR

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

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

File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();

答案 2 :(得分:19)

您必须指定从/

开始的路径
URL resource = YourClass.class.getResource("/abc");
Paths.get(resource.toURI()).toFile();

答案 3 :(得分:10)

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

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

答案 4 :(得分:0)

返回文件或文件路径

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

答案 5 :(得分: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之类的内容。

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