如何修复javax.imageio.IIOException:无法在Linux上读取输入文件

时间:2019-07-15 10:57:53

标签: java embedded-resource

我正在开发一个小的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,因为在我的情况下接受的答案不起作用,并且语法完全不同,并且与我的问题中的接受的答案完全不同。此外,该编辑内容也没有清楚地显示出如何适应该解决方案。

1 个答案:

答案 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文件中时,代码将起作用。