繁体   English   中英

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

[英]Loading resources (images) contained in a .Jar file or in the classpath

因此,我尝试过各种阅读有关堆栈交换的此问题的各种修复方法,大多数人都说我使用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<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))解决方案有效。 唯一的事情是我需要将图像文件放在罐子的文件夹中。 例如,我有文件夹:--- File.Jar --- Images.png --- ImageFolder ------- imagefolder.png中有更多图像

当它们位于那样的位置时,我可以加载所有图像。 我的实际问题是,当我导出.Jar图像时也位于其中,是否可以仅使用位于.jar内的图像? 还是我必须像上面那样将images打包在jar旁边的文件夹中,它可以工作,但我更多是在寻找可运行的.Jar,我可以将其转换为toher,而无需它们也需要.jar之外的图像。

有关如何加载类路径资源的问题反复出现,并且对于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));
    }
}

运行:

java -cp resLoader.jar image.ImageLoader test4

希望这堂课可以帮助您理解不同的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM