我正在开发一个小的Gui应用程序,并想从资源文件夹中加载我的图片。在Windows上确实可以使用,但在Linux(Ubuntu 19.04和Raspbian Buster)上则不能。 我一直在尝试从
切换getClass().getResource("black.jpg").getFile()
到
getClass().getClassLoader().getResource("black.jpg").getFile()
这是我的View类,从JFrame(简称)扩展
public View() {
try {
bI = ImageIO.read(new File(getClass().getClassLoader().getResource("black.jpg").getFile()));
} catch (IOException e) {
e.printStackTrace();
}
[...]
contentPane = new BackgroundPanel(bI);
终端中的错误消息:
javax.imageio.IIOException: Can't read input file!
at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1308)
at de.grapatin.escaperoom.view.View.<init>(View.java:38)
at de.grapatin.escaperoom.controller.Controller.<init
(Controller.java:11)
at de.grapatin.escaperoom.App.main(App.java:11)
我希望图像能够显示,但是不会发生。背景是黑色的(就像我的代码中的图像black.jpg一样),但是交换它并不能解决问题。
项目结构:
─src
│ ├───main
│ │ ├───java
│ │ │ └───de
│ │ │ └───marvin
│ │ │ └───uitest
│ │ │ ├───controller
│ │ │ ├───model
│ │ │ │ └───enums
│ │ │ ├───util
│ │ │ └───view
│ │ └───resources
│ │ └───images
的输出
System.out.println(getClass().getResource("/black.jpg").getFile());
是
file:/C:/Users/marvin/uitest/target/uitest-0.0.1-SNAPSHOT.jar!/black.jpg
!不是来自我这边
我刚刚发现Windows也不从jar中读取图像文件。但是它在文件夹的根目录中。
此问题与以下问题无关:imageio.IIOException: Can't read input file,因为在我的情况下接受的答案不起作用,并且语法完全不同,并且与我的问题中的接受的答案完全不同。此外,该编辑内容也没有清楚地显示出如何适应该解决方案。
答案 0 :(得分:1)
请勿使用URL的getFile()方法。它不返回有效的文件名。它实际上返回URL的路径部分,所有百分号转义均保持不变。之所以命名为getFile,是因为URL类是90年代中期发布的Java 1.0的一部分,当时几乎所有URL都引用同一文件或不同计算机上的物理文件。
幸运的是,您不需要它。您可以只使用read method of ImageIO which takes a URL:
bI = ImageIO.read(getClass().getResource("/images/black.jpg"));
将资源视为URL而不是文件而不是文件的一个重要好处是,当您将程序打包到.jar文件中时,代码将起作用。