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

pdkcd3nj  于 2023-11-17  发布在  Maven
关注(0)|答案(7)|浏览(181)

假设标准的maven设置。
假设在资源文件夹中有一个文件abc
在Java中,如何获得文件的绝对路径?

6ojccjat

6ojccjat1#

正确的方法是:

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

字符串
现在文件在类路径中的物理位置并不重要,只要资源实际上是一个文件而不是一个目录项,就可以找到它。
(The看起来很明显new File(resource.getPath())并不适用于所有路径!路径仍然是URL编码的!)

erhoui1w

erhoui1w2#

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

b91juud3

b91juud33#

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

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

字符串

eiee3dmh

eiee3dmh4#

创建你需要的类的classLoader示例,然后你可以很容易地访问文件或资源。现在你使用该类的getPath()方法访问路径。

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

字符串

cld4siwp

cld4siwp5#

在我们通往绝对道路的路上有两个问题:
1.找到的位置将不是源文件所在的位置,而是类保存的位置。资源文件夹几乎肯定会位于项目的源文件夹中的某个位置。
1.如果类直接在工作区中的插件或包中运行,则用于检索资源的相同函数的工作方式不同。
下面的代码将给予我们所有有用的路径:

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/


在这里,我们可以得到绝对路径只结合 both 函数的结果。这是不够的。在它们之间,我们应该把类包所在的地方的本地路径,相对于插件文件夹。可能,你将不得不在这里插入srcsrc/test/resource
您可以将代码插入到您的代码中,并查看您拥有的路径。

jchrr9hc

jchrr9hc6#

返回文件或文件路径

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

字符串

4ktjp1zp

4ktjp1zp7#

这对我来说很有效:

try {           
    java.net.URL YourClassDir = YourClass.class.getResource("YourClass.class");                 
    String YourClassActionDirStr = YourClassDir.toString();
    System.out.println(YourClassActionDirStr);        
} catch (Exception e) {
    System.out.println(e);
}

字符串
结果:
文件:/C:/...目录

相关问题