gpt4 book ai didi

java - 为什么 getResourceAsStream 返回 null?

转载 作者:行者123 更新时间:2023-12-01 12:25:59 41 4
gpt4 key购买 nike

我的 jar 中有一个图像,我正在尝试加载它,但 getResourceAsStream() 始终返回 null。

目录结构:

com/thesimpzone/watch_pugs/watch_pugs/{all my class files}
META-INF/MANIFEST.MF
resources/generic/mouse.png

内容.java:

public abstract class Content {

protected Map<String, BufferedImage> images = new HashMap<String, BufferedImage>();

protected String prefix;

public Content(String prefix){
this.prefix = prefix;
}

protected void loadImage(String name){
System.out.println(name);
System.out.println(prefix);
String path = (prefix + name);
System.out.println(path);
String identifier = name.substring(0, name.lastIndexOf("."));
try{
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
images.put(identifier, ImageIO.read(in));
}catch(IOException | ClassCastException e){
throw new RuntimeException("Image " + identifier + " at " + path + " could not be loaded.");
}
}
[...]
}

GenericContent.java:

public class GenericContent extends Content {

public GenericContent(){
super("resources/generic/");
this.loadContent();
}

@Override
public void loadContent() {
loadImage("mouse.png");
}

}

堆栈跟踪:

mouse.png
resources/generic/
resources/generic/mouse.png
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(ImageIO.java:1348)
at com.thesimpzone.watch_pugs.watch_pugs.content.Content.loadImage(Content.java:29)
at com.thesimpzone.watch_pugs.watch_pugs.content.GenericContent.loadContent(GenericContent.java:17)
at com.thesimpzone.watch_pugs.watch_pugs.content.GenericContent.<init>(GenericContent.java:12)
at com.thesimpzone.watch_pugs.watch_pugs.Canvas.<init>(Canvas.java:45)
at com.thesimpzone.watch_pugs.watch_pugs.Framework.<init>(Framework.java:75)
at com.thesimpzone.watch_pugs.watch_pugs.Window.<init>(Window.java:50)
at com.thesimpzone.watch_pugs.watch_pugs.Window.<init>(Window.java:26)
at com.thesimpzone.watch_pugs.watch_pugs.Window$1.run(Window.java:60)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

我不知道为什么类加载器找不到图像。我查看了编译后的 jar,文件就在那里,并且在 Paint 中打开得很好,所以文件没问题。我尝试了各种 ClassLoader 变体,包括 getSystemClassLoader()、getClassLoader() 和 Content.class.getClassLoader();还有 getResourceAsStream(path) 而不是 getResource(path).openStream()。我已经尝试过在前缀上使用和不使用前导“/”,所以我完全没有想法,谷歌也没有帮助。另外,我正在做的定义“前缀”的事情似乎非常尴尬,所以如果有更好的方法,如果有人向我展示如何做,我会很高兴。

谢谢。

最佳答案

调用 getResourceAsStream() 时,一切都与相对包和绝对包有关,您正在寻找与作为根的包 Content 相关的内容。

类路径上没有“目录”,特别是在 .jar 文件内,只有包

最好使用的是Thread.currentThread().getContextClassloader().getResourceAsStream(),带有完全限定的包没有领先的/.

这样做最好的原因是,在应用程序容器内部,它们通常有多个类加载器,这样您就不必关心您的资源是从哪一个加载的。

就您而言:

Thread.currentThread().getContextClassloader().getResourceAsStream("resources/generic/mouse.png");

如果您使用此方法仍然遇到错误,则您的 .jar 并未像您想象的那样构建,或者如果您从 IDE 内部获取此内容,则您可能没有复制内容resource/generic/ 到类路径中。

我个人总是使用以下形式:

Thread.currentThread().getContextClassLoader().getResourceAsStream("path/to/resource/file.ext"); 因为无论你在哪里调用它,无论你使用什么类加载器,它总是可以工作的在,并且它明确关于它在哪里寻找它正在寻找的东西。

关于java - 为什么 getResourceAsStream 返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26327430/

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