如何使用相对路径在包外部查找图像

时间:2018-03-06 18:55:24

标签: java intellij-idea

所以我试图在我的应用程序结构中进一步访问存储在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。

此应用程序将用于不同的设备,因此需要使用相对路径。

非常感谢

2 个答案:

答案 0 :(得分:1)

您可以尝试通过当前线程使用上下文类加载器来获取图像资源。

这些方面的东西:

public static void main(String[] args) throws IOException {
    URL resource = Thread.currentThread().getContextClassLoader().getResource("res/image.png");
    ImageIcon image = new ImageIcon(ImageIO.read(resource));
}

答案 1 :(得分:1)

这个项目中的文件夹结构看起来非常不寻常。那应该是:

src
|-main
   |-java
   |  |-package1
   |     |-innerPackage1
   |        |-Test.java   // although *Test* should be under src/test
   |-resources
      |-image.png

在IntelliJ项目配置中,src/main/java应标记为"来源root"和src/main/resources as"资源root"。这可以在项目设置中完成,也可以在文件夹上单击鼠标右键。

重组项目后,图像应可通过getResource("/image.png")访问。或者,移到src/main/resources/package1/innerPackage1,通过getResource("image.png")

更新

使用相对路径进行一些测试后,使用原始文件夹结构。 Test.class.getResource(".")应该返回:

file:/{path to project}/{project name}/out/production/{project name}/package1/innerPackage1

因此,如果我们调用Test.class.getResource("../.."),我们会爬到根网址以获取包含内容:

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));

这应该可以解决问题,但它远不是一个干净的解决方案。

IntelliJ将

src文件夹视为"来源root"文件夹,它不能包含资源文件夹里面。 src未包含在目标路径中,也不应包括res

所以我建议将res文件夹移动到与src相同的级别,并将其标记为"资源root"。之后,以下内容应该正常工作:

URL resource = Test.class.getResource("/image.jpg");
ImageIcon image = new ImageIcon(ImageIO.read(resource));