Почему getResourceAsStream () работает в IDE, но не в JAR?

Я просто хочу прочитать файл в моей программе. Файл находится на одну директорию выше рабочей директории по адресу "..Х /ф.ФСГ". Поэтому следующий код работает правильно, когда я запускаю его в IDE

String name="../f.fsh";
InputStream is = getClass().getResourceAsStream(name);
InputStreamReader isreader=new InputStreamReader(is);//CRASHES HERE WITH NULL POINTER EXCEPTION
BufferedReader br = new BufferedReader(isreader);

но когда я создаю файл JAR, который имеет f.fsh застегивается внутри него и запускает его, он аварийно завершает работу при создании InputStreamReader, потому что InputStream равен null.

Я прочитал кучу ответов на вопросы о входных потоках и файлах JAR, и что я получил из этого что я должен использовать относительные пути, но я уже делаю это. Из того, что я понимаю, getResourceAsStream() может найти файлы относительно корня проекта, это то, что я хочу. Почему он не работает в банке? Что происходит, как я могу это исправить?

это связано с переменной classpath? Я думал, что это только для включения файлов, внешних для запуска jar.

Я также пробовал, но все равно терплю неудачу, когда ставлю косую черту:

InputStream is = getClass().getResourceAsStream(""+name);

I посмотрел на:как получить путь к ресурсу в файле java JAR andfound что содержание ОПАРНИКА не может обязательно быть accesible как архив. Поэтому я попытался скопировать файл относительно jar (один каталог из jar), и это все еще не удается. В любом случае я хотел бы оставить свои файлы в банке и прочитать их там. Я не знаю, что происходит.

2 ответов


Если .. работает в Class.getResourceAsStream() во время работы с Eclipse это ошибка в Eclipse. Eclipse и другие IDE реализуют пользовательские загрузчики классов для извлечения ресурсов из проекта во время выполнения. Похоже, что реализация загрузчика классов в Eclipse не выполняет все необходимые проверки на входе в getResourceAsStream() метод. В этом случае ошибка в вашу пользу, но вам все равно нужно будет переосмыслить, как вы структурируете свои ресурсы, чтобы ваш код работал во всех случаях.


вы не можете использовать .. с Class.getResourceAsStream().

для загрузки ресурса f.fsh в том же пакете, что и класс, используйте SomeClass.class.getResourceAsStream("f.fsh")

для загрузки ресурса f.fsh в подпакете foo.бар пакета класса, используйте SomeClass.class.getResourceAsStream("foo/bar/f.fsh")

для загрузки ресурса f.fsh в любом пакете com.компания.foo.бар, используйте SomeClass.class.getResourceAsStream("/com/company/foo/bar/f.fsh")

это описано в javadoc getResource() метод, хотя ему не хватает примеров.