我试图用
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
运行这个:
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()
,然后盲目继续”的范例真的有害,当只发生一个时,会在日志中导致大量错误(想一想 - 发生了意想不到的事情,所以,你.. . 打印一份关于那个的报告然后继续下去?不要继续下去!) - 让你写出糟糕的代码然后导致愚蠢的抱怨('哦不,javanull
很烦人 - 实际上,它不是,但如果你一直在编写通过将错误打印到控制台并返回 null 来对错误做出反应的方法,是的,then 它变得烦人。停止这样做)。
NB:您可以使用任何 zip 工具或
java tvf mygame.jar
检查 jar 文件的内容。如果图像根本不在那里,那么您的构建已损坏,我建议您发布一个新问题,发布您的构建过程(例如pom.xml
或build.gradle
或诸如此类,以及您运行什么命令来构建您的罐子) ,发布你的 jar 包含的内容,发布你想要的内容,并发布你的项目的基本结构(例如 posix 终端环境中 find
命令的输出)。