情景:
ancilliaryUI/Graphics/FAS-IconFiles/{*.png}
/ancilliaryUI/Graphics/FAS-IconFiles
getContextClassLoader().getResourceAsStream(resource)
; null
,我会使用getClass().getResourceAsStream(resource)
InputStreamReader
InputStream
BufferedReader
InputStreamReader
以上所有工作都在IDE和程序代码中(返回有效对象)
BufferedReader
循环br.readLine()
/ancilliaryUI/Graphics/FAS-Icon-Files
路径IconImage
。都好。
当我构建应用程序时,我会查看jar文件,所有图像都在正确的路径中。如果我将应用程序运行为:
java -jar appname.jar
我从br.readLine()
得到一个NullPointerException,即使我上面的任何对象都不为null。
注意:br.readLine
只会读取资源名称'每个图像并将字符串传回给另一个创建ImageIcon
的方法。资源名称'由于异常,字符串永远不会返回。然而,如果从IDE运行,所有这些都可以正常工作。
任何帮助将不胜感激。 谢谢!
这里是代码(在绝望中加载调试):
private List<String> getResources(String path) throws IOException {
List<String> filenames = new ArrayList<>();
BufferedReader br = null;
Debug.printm("PATH = " + path);
try {
InputStream in = getResourceAsStream(path);
InputStreamReader isReader = new InputStreamReader(in);
Debug.printm("isReader = " + isReader.toString());
br = new BufferedReader(isReader);
} catch (Exception e) {
throw e;
}
String resource;
Debug.printm("Going to readLine(" + path + "): br = " + br.toString());
try {
while ((resource = br.readLine()) != null) {
Debug.printm("Adding resource: " + resource);
filenames.add(resource);
}
} catch (Exception e) {
Debug.printm("readLine(): " + e.getLocalizedMessage());
throw e;
}
Debug.printm("path = " + path);
return filenames;
}
private InputStream getResourceAsStream(String resource) {
final InputStream in
= getContextClassLoader().getResourceAsStream(resource);
return in == null ? getClass().getResourceAsStream(resource) : in;
}
private ClassLoader getContextClassLoader() {
return Thread.currentThread().getContextClassLoader();
}
答案 0 :(得分:0)
到这里它可能会给你一些关于如何解决困境的提示
答案 1 :(得分:0)
我通过广泛搜索How can I get a resource "Folder" from inside my jar File?找到了解决方案。我选择以不同方式实现我的资源列表,并且更快。但是,我将保留此代码段以供将来参考。 谢谢user1079877!