一尘不染

在Java中使用相对路径打开资源

java

在我的Java应用程序中,我需要获取一些文件和目录。

这是程序结构:

./main.java
./package1/guiclass.java
./package1/resources/resourcesloader.java
./package1/resources/repository/modules/   -> this is the dir I need to get
./package1/resources/repository/SSL-Key/cert.jks    -> this is the file I need to get

guiclass 加载resourcesloader类,该类将加载我的资源(目录和文件)。

至于文件,我试过了

resourcesloader.class.getClass().getResource("repository/SSL-Key/cert.jks").toString()

为了获得真实的路径,但是这种方式行不通。

我不知道如何做目录。


阅读 247

收藏
2020-03-23

共2个答案

一尘不染

提供相对于类加载器的路径,而不是要从中获取加载器的类。例如:

resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString();
2020-03-23
一尘不染

我在使用该getClass().getResource("filename.txt")方法时遇到问题。阅读Java文档说明后,如果你的资源与尝试从中访问资源的类不在同一个包中,则必须给它相对路径,以开头'/'。推荐的策略是将资源文件放在根目录下的“ resources”文件夹下。因此,例如,如果你具有以下结构:

src/main/com/mycompany/myapp

然后你可以按照maven的建议在以下位置添加一个资源文件夹:

src/main/resources

此外,你可以在资源文件夹中添加子文件夹

src/main/resources/textfiles

并说你的文件被调用,myfile.txt所以你有

src/main/resources/textfiles/myfile.txt

现在,这里出现了愚蠢的路径问题。假设你的中有一个类com.mycompany.myapp package,并且你myfile.txt要从资源文件夹中访问文件。有人说你需要提供:

"/main/resources/textfiles/myfile.txt" path

要么

"/resources/textfiles/myfile.txt"

这两个都是错误的。运行后mvn clean compile,文件和文件夹将复制到:

myapp/target/classes 

夹。但是资源文件夹不存在,仅是资源文件夹中的文件夹。所以你有了:

myapp/target/classes/textfiles/myfile.txt

myapp/target/classes/com/mycompany/myapp/*

因此,赋予该getClass().getResource("")方法的正确路径是:

"/textfiles/myfile.txt"

这里是:

getClass().getResource("/textfiles/myfile.txt")

这将不再返回null,而是返回你的课程。我希望这对某人有帮助。对于我来说很奇怪,该"resources"文件夹也没有被复制,而是仅直接复制该文件夹中的子文件夹和文件"resources"。在我看来,在以下位置"resources"也可以找到该文件夹"myapp/target/classes"

2020-03-23