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

2022-08-31 11:10:50

在我的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.class.getClass().getResource("repository/SSL-Key/cert.jks").toString()

为了得到真正的路径,但这种方式不起作用。

我不知道该目录使用哪个路径。


答案 1

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

src/main/com/mycompany/myapp

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

src/main/resources

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

src/main/resources/textfiles

并说您的文件被调用,因此您有myfile.txt

src/main/resources/textfiles/myfile.txt

现在,愚蠢的路径问题就在这里。假设您的 中有一个类,并且您希望从资源文件夹中访问该文件。有人说你需要给:com.mycompany.myapp packagemyfile.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"


答案 2

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

resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString();

推荐