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

Java 如何使用相对路径查找包外部的图像,java,intellij-idea,Java,Intellij Idea,因此,我试图访问存储在应用程序结构更上层的res包中的图像 结构看起来像这样 src -> package1 -> -> innerPackage1 -> -> -> Test.java -> res -> -> image.png 所以我试图从内部类访问映像。 这就是我迄今为止所尝试的,再加上许多似乎从未奏效的路径变化 URL resource = Test.class.getResource("/res/image.png"); I

因此,我试图访问存储在应用程序结构更上层的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的构建路径是否有问题

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


非常感谢

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

大致如下:

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

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

src
|-main
   |-java
   |  |-package1
   |     |-innerPackage1
   |        |-Test.java   // although *Test* should be under src/test
   |-resources
      |-image.png
在IntelliJ项目配置中,
src/main/java
应标记为“sources root”,而
src/main/resources
应标记为“resources 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(“../”)
,我们将爬到打包内容的根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
相同的级别,并将其标记为“resources root”。之后,以下各项应正常工作:

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

您是否尝试过将其放入resources文件夹并使用绝对路径?@jrtapsell我无法使用绝对路径,因为此应用程序设计用于与Jar相关的不同系统解决方案,与文件系统不同,我尝试了此操作,但仍然得到相同的错误-系统找不到指定的路径我应该调用“Test”类(即Test.class.getResource)上的get resource吗?您是如何在IntelliJ中创建项目的?它是什么类型的项目?在项目设置中,“模块->路径”中有哪些值?您是否尝试调用
Test.class.getClassLoader().getResource(arg)?我从github repo克隆了该项目。据我所知,这只是一个普通的应用程序。没有价值观?它只检查了“继承项目编译输出路径”。我只是试着重新安装intellij并使用默认设置,但仍然不起作用。我试图重现这些问题,并做了一些测试。一些新的建议在我的答案更新上面。