所以我试图访问我存储在应用程序结构中的 res 包中的图像。
结构如下
src
-> package1
-> -> innerPackage1
-> -> -> Test.java
-> res
-> -> image.png
所以我尝试从内部类访问图像。 这是我到目前为止所尝试过的,还有更多的路径变体,但似乎从未奏效。
URL resource = Test.class.getResource("/res/image.png");
ImageIcon image = new ImageIcon(ImageIO.read(resource));
ImageIcon image = new ImageIcon("./res/image.png");
真正让我困惑的是我什至尝试将图像直接放入与 java 类相同的包中并调用
ImageIcon image = new ImageIcon("image.png");
即使这样也不起作用,所以现在我完全陷入了停滞。
它唯一一次对我有用是当我将类文件和图像文件直接移动到 src 文件中时
src
-> Test.java
-> image.png
然后这终于起作用了:
new ImageIcon( "./src/image.png" )
我现在想知道我正在使用的 IDE - intellij 的构建路径是否有问题。
该应用程序将在不同的设备上使用,因此需要使用相对路径。
非常感谢
最佳答案
这个项目中的文件夹结构看起来非常不传统。应该是:
src
|-main
|-java
| |-package1
| |-innerPackage1
| |-Test.java // although *Test* should be under src/test
|-resources
|-image.png
在 IntelliJ 项目配置中,src/main/java
应标记为“源根”,src/main/resources
应标记为“资源根”。这可以在项目设置中或右键单击文件夹来完成。
重组项目后,应该可以通过 getResource("/image.png")
访问图像。或者,通过 getResource("image.png")
移入 src/main/resources/package1/innerPackage1
。
更新
经过一些相对路径的测试后,使用原始文件夹结构。
Test.class.getResource(".")
应返回:
file:/{path to project}/{project name}/out/production/{project name}/package1/innerPackage1
因此,如果我们调用 Test.class.getResource("../..")
,我们就会爬到打包内容的根 URL:
file:/{path to project}/{project name}/out/production/{project name}/
现在,如果我们调用 Test.class.getResource("../../res/image.png")
,它应该可以访问。
URL resource = Test.class.getResource("../../res/image.jpg");
ImageIcon image = new ImageIcon(ImageIO.read(resource));
这应该可以解决问题,但远非一个干净的解决方案。
src
文件夹被 IntelliJ 视为“源根”文件夹,并且内部不能包含资源文件夹。 src
不包含在目标路径中,res
也不应包含在目标路径中。
因此,我建议将 res
文件夹移至与 src
相同的级别,并将其标记为“资源根目录”。之后,以下内容应该可以正常工作:
URL resource = Test.class.getResource("/image.jpg");
ImageIcon image = new ImageIcon(ImageIO.read(resource));
关于java - 如何使用相对路径查找包外的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49138070/