- У меня есть каталог/папку в моем приложении дерева, содержащие изображения
ancilliaryUI/Graphics/FAS-IconFiles/{*.png}
- В IDE (NetBeans) мой код получает ресурс как InputStream для
/ancilliaryUI/Graphics/FAS-IconFiles
getContextClassLoader().getResourceAsStream(resource)
;- если выше возвращает
null
, я используюgetClass().getResourceAsStream(resource)
- Я экземпляр
InputStreamReader
сInputStream
сверху - Я экземпляр
BufferedReader
сInputStreamReader
Все вышеперечисленное работы в IDE и программный код (возвращаемые действительные объекты)
- Тогда я петля над
BufferedReader
сbr.readLine()
- Это делает, как и ожидалось: каждая итерация возвращает имя типа String изображения в
/ancilliaryUI/Graphics/FAS-Icon-Files
пути - я затем использовать его для извлечения ресурса в виде потока и создать
IconImage
. Все хорошо. Когда я создаю приложение, я просматриваю файл jar и все изображения находятся там по правильному пути.
- Это делает, как и ожидалось: каждая итерация возвращает имя типа String изображения в
Если я запустить приложение как:
java -jar appname.jar
Я получаю NullPointerException от br.readLine()
, хотя ни один из моих объектов выше не равны нулю. ПРИМЕЧАНИЕ. br.readLine
просто считывает «имя ресурса» каждого изображения и передает строку другому методу, который создает ImageIcon
. Название ресурса String никогда не возвращается из-за исключения. И все же все это прекрасно работает, если вы запускаете 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();
}