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

use*_*953 1 java 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在我的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用将图像加载到主程序中

ImageLoader loader = new ImageLoader();
    spriteSheet = loader.load("/spritesheet.png");
Run Code Online (Sandbox Code Playgroud)

现在在日食中游戏运行并加载所有图像完全正常.但我想要做的是将它导出到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>
Run Code Online (Sandbox Code Playgroud)

所以我收集的是图像文件的位置没有被正确读取,或者我以某种方式错误地输入它们,它返回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之外的图像.

rob*_*ann 7

关于如何加载类路径资源的问题是反复出现的,对于Java新手来说有点混乱:一些答案表明class.getClassLoader().getResourceAsStream,其他人class.getResourceAsStream,尽管他们的语义略有不同:

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

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

在此输入图像描述

班级:

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

运行:

java -cp resLoader.jar image.ImageLoader test4

希望这门课可以帮助理解不同的行为.