Почему 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()
метод, хотя ему не хватает примеров.