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

所以我尝试了各种各样的解决方案,在堆栈交换上解决这个问题,大多数人说使用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"); 

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

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

所以我收集的是图像文件位置没有被正确读取或者我以某种方式错误地输入它们,这返回null并且没有任何图像正在加载。 运行.Jar时,Panel会出现,但没有任何内容被绘制,并且给出了错误。 这个程序在eclipse中完美运行,没有错误和所有图像加载。

编辑1:Robermann你的解决方案getClass()。getClassLoader()。getResourceAsStream(path))工作。 唯一的问题是我需要将图像文件放在带有jar的文件夹中。 比如我有文件夹:— File.Jar — Images.png — ImageFolder ——-更多imgaes in imagefolder.png

当它们被定位时,我可以加载所有图像。 我的实际问题是,当我导出.Jar时,图像也位于内部,是否可以使用位于.jar内的图像? 或者我必须将imga包装在jar子旁边的文件夹中,如上所述,它可以工作,但我更需要一个可运行的.Jar,我可以转移到托架而不需要它们也需要.jar之外的图像。

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

  1. class.getResourceAsStream执行路径转换
  2. class.getClassLoader()。getResourceAsStream不转换路径

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

在此处输入图像描述

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

希望本课程可以帮助理解不同的行为。