使用URL或文件(在ImageIO.read中)

我制作了一个使用多个图像的应用程序。 我有2种方式来运行我的应用程序:
– 按想法run
– 制作一个胖jar文件并从控制台java -jar app.jar运行它

如果我想从Idea运行它我必须使用:

BufferedImage backgroundImage = ImageIO.read(new File("res/field.png"));

代替

BufferedImage backgroundImage = ImageIO.read(getClass().getClassLoader().getResource("res/field.png"));
< – 这就是我在jar文件中使用的情况

为什么? 我以为他们差不多了。 我的案子有通用的方法吗?

我一直用:

 BufferedImage backgroundImage = ImageIO.read(getClass().getResource("res/field.png")); 

它既可以在IDE中运行,也可以在jar内部运行。 .getResource(…)返回一个URL,jar://或file://

请注意,路径要么以/开头(在这种情况下它是相对于包根),要么是相对于类包 – 如果你的类是com.example.Test, /res/引用文件夹com /例如/测试/ RES /。

您甚至可以使用静态版本 – YourClassName.class.getResource(…),它允许您轻松到达包树的其他“分支”(您可以使用引用来自位于不同分支的类)

对于java.io ,相对路径依赖于当前工作目录。 使用getResource,您必须在classpath拥有该资源。