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

How to Fix javax.imageio.IIOException: Can't read input file on Linux

我正在开发一个小型 Gui 应用程序并想从资源文件夹加载我的图像。这对 Windows 有效,但对 Linux(Ubuntu 19.04 和 Raspbian Buster)无效。

我一直在尝试从

切换
getClass().getResource("black.jpg").getFile()

getClass().getClassLoader().getResource("black.jpg").getFile()

这是我的视图 Class,从 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 因为已接受的答案在我的情况下不起作用,并且语法完全不同并且与我的问题中已接受的答案相反。此外,编辑没有清楚地显示如何调整解决方案。

不要使用 URL 的 getFile() 方法。它不是return有效的文件名。它实际上 return 是 URL 的路径部分,所有 percent-escapes 都完好无损。之所以命名为 getFile,是因为 URL class 是 Java 1.0 的一部分,该版本于 90 年代中期发布,当时几乎所有 URL 都指的是物理文件,要么在同一台计算机或不同的计算机上。

幸运的是,你不需要它。您可以只使用 read method of ImageIO which takes a URL:

bI = ImageIO.read(getClass().getResource("/images/black.jpg"));

将资源视为 URL 而非文件的一个重要好处是,当您将程序打包到 .jar 文件中时,您的代码将正常工作。