gpt4 book ai didi

java - 加载包含在 .Jar 文件或类路径中的资源(图像)

转载 作者:行者123 更新时间:2023-11-29 06:35:12 26 4
gpt4 key购买 nike

所以我已经尝试了各种阅读堆栈交换上这个问题的各种修复,大多数人说使用 getResourceAsStream() 方法,我已经完成了。这是我的 Jar 资源输入法。

import java.io.InputStream;

public class ResourceLoader {
public static InputStream load(String path){
InputStream input = ResourceLoader.class.getResourceAsStream(path);
if(input == null){
input = ResourceLoader.class.getResourceAsStream("/" + path);
}
return input;
}
}

然后在我的 ImageLoader 类中使用它。

public class ImageLoader {

public BufferedImage load(String path){
try {
// return ImageIO.read(getClass().getResource(path));
return ImageIO.read(ResourceLoader.load(path));
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}

图像在主程序中使用

加载
ImageLoader loader = new ImageLoader();
spriteSheet = loader.load("/spritesheet.png");

现在在 eclipse 中游戏运行并加载所有图像都非常好。但我想做的是将它导出到 Jar,这是我使用一些教程完成的,已成功使用包含我使用的图像的资源文件夹导出它。但是,当我尝试运行 .jar 文件时,此错误会在 cmd 行中弹出。

Exception in thread "Thread-2" java,lang.IllegalArgumentException: input == null
!
at javax.imageio.ImageIO.read<Image.IO.java:1348>
at gfx.ImageLoader.load<ImageLoader.java:15>
at man.Gaim.init(Game.java:100>
at main.Game.run<Game.java:150>
at java.lang.Thread.run<Thread.java:722>

所以我收集到的是图像文件位置没有被正确读取或者我输入错误以某种方式返回 null 并且没有图像正在加载。当 .Jar 运行时,面板出现,但没有绘制任何内容,并给出该错误。该程序在 eclipse 中运行完美,没有错误,所有图像都已加载。

编辑 1:Robermann 您的 getClass().getClassLoader().getResourceAsStream(path)) 解决方案有效。唯一的问题是我需要将图像文件放在带有 jar 的文件夹中。例如我有文件夹:---文件.Jar---图片.png---图片文件夹------imagefolder.png 中的更多图片

我可以加载所有图像,当它们位于那样的位置时。我的实际问题是,当我导出 .Jar 时,图像也位于内部是否可以只使用位于 .jar 内部的图像?或者我是否必须像上面那样将 imgaes 打包到 jar 旁边的文件夹中,它有效,但我更想寻找一个可运行的 .Jar,我可以将其传输给其他人,而无需他们也需要 .jar 之外的图像。

最佳答案

如何加载类路径资源的问题反复出现,对于 Java 新手来说有点困惑:一些答案建议使用 class.getClassLoader().getResourceAsStream,其他建议使用 class.getResourceAsStream,尽管它们的语义略有不同:

  1. class.getResourceAsStream进行路径翻译
  2. class.getClassLoader().getResourceAsStream不翻译路径

为了更好地展示差异,我将提出以下测试类,它以 4 种不同的方式尝试加载相同的资源(图像),只有 2 种工作取决于使用的路径。 Jar 内容树是:

enter image description here

类(class):

package image;

import java.io.InputStream;

public class ImageLoader {
public static void main(String[] args ){
String cmd = null;
InputStream is = null;
final String image = "save.png";

if("test1".equals(args[0])){
cmd = "ImageLoader.class.getClassLoader().getResourceAsStream(\""+image+"\")";
is = ImageLoader.class.getClassLoader().getResourceAsStream(image); //YES, FOUND


}else if("test2".equals(args[0])){
cmd = "ImageLoader.class.getResourceAsStream(\""+image+"\")";
is = ImageLoader.class.getResourceAsStream(image); //NOT FOUND

}else if("test3".equals(args[0])){
cmd = "ImageLoader.class.getResourceAsStream(\"/"+image+"\")";
is = ImageLoader.class.getResourceAsStream("/"+image); //YES, FOUND

}else if("test4".equals(args[0])){
cmd = "ImageLoader.class.getClassLoader().getResourceAsStream(\"/"+image+"\")";
is = ImageLoader.class.getClassLoader().getResourceAsStream("/"+image); //NOT FOUND

}else {
cmd = " ? ";
}

System.out.println("With "+cmd+", stream loaded: "+(is != null));
}
}

运行:

java -cp resLoader.jar image.ImageLoader test4

希望这门课能帮助理解不同的行为。

关于java - 加载包含在 .Jar 文件或类路径中的资源(图像),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22203162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com