getResourceAsStream 返回 null [重复]

问题描述 投票:0回答:1

我试图用

getResourceAsStream
获取图像并放入
InputStream
但值仍然返回null。 这是代码:

public static BufferedImage GetSpriteAtlas(String fileName) {
    BufferedImage img = null;
    InputStream is = LoadSave.class.getResourceAsStream("/" + fileName);
    try {
        img = ImageIO.read(is);

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return img;
}

这是我的项目树。

-Project
  -src
    -main
      -java
        -utilities
          -LoadSave.java
      -resources
        -image.png
    
java inputstream
1个回答
0
投票

运行这个:

System.out.println(LoadSave.class.getResource("LoadSave.class"));
。这会告诉你它的确切位置。

然后确保你的图像在同一个地方。所以,如果,比如说,打印出如下内容:

file:jar:/home/niccolo/project/foo/dist/mygame.jar!/com/pkg/LoadSave.class

然后上面的代码将在

/image.png
中寻找条目
mygame.jar
。确保它在那里。或者,如果它在那里但在不同的路径中,例如,在
/img/image.png
,将您的呼叫编辑为
"/img/" + fileName
。确保也打印 (
"/" + fileName
) 并记住大小写很重要,它必须完全匹配,并且资源文件中不能超过 1 个点(
save_icon.png
很好。
save.icon.png
不起作用出于愚蠢的遗留原因)。

此外,您使用的是 15 年前过时的 Java 构造。这更简单,更短,更难意外导致资源泄漏:

public static BufferedImage GetSpriteAtlas(String fileName) {
    try (var is = LoadSave.class.getResourceAsStream("/" + fileName)) {
        return ImageIO.read(is);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

试穿更简单更安全。 “捕获异常,运行

e.printStackTrace()
,然后盲目继续”的范例真的有害,当只发生一个时,会在日志中导致大量错误(想一想 - 发生了意想不到的事情,所以,你.. . 打印一份关于那个的报告然后继续下去?不要继续下去!) - 让你写出糟糕的代码然后导致愚蠢的抱怨('哦不,java
null
很烦人 - 实际上,它不是,但如果你一直在编写通过将错误打印到控制台并返回 null 来对错误做出反应的方法,是的,then 它变得烦人。停止这样做)。

NB:您可以使用任何 zip 工具或

java tvf mygame.jar
检查 jar 文件的内容。如果图像根本不在那里,那么您的构建已损坏,我建议您发布一个新问题,发布您的构建过程(例如
pom.xml
build.gradle
或诸如此类,以及您运行什么命令来构建您的罐子) ,发布你的 jar 包含的内容,发布你想要的内容,并发布你的项目的基本结构(例如 posix 终端环境中
find
命令的输出)。

© www.soinside.com 2019 - 2024. All rights reserved.