Вопрос-ответ

How do I read a resource file from a Java jar file?

Как мне прочитать файл ресурсов из файла Java jar?

Я пытаюсь получить доступ к XML-файлу внутри файла jar из отдельного jar, который работает как настольное приложение. Я могу получить URL-адрес нужного мне файла, но когда я передаю его в программу чтения файлов (в виде строки) Я получаю исключение FileNotFoundException, в котором говорится: "Синтаксис имени файла, каталога или метки тома неверен".

Для справки, у меня нет проблем с чтением ресурсов изображений из того же jar, передавая URL-адрес конструктору ImageIcon. Кажется, это указывает на то, что метод, который я использую для получения URL-адреса, правильный.

URL url = getClass().getResource("/xxx/xxx/xxx/services.xml");
ServicesLoader jsl = new ServicesLoader( url.toString() );

Внутри класса ServicesLoader у меня есть

XMLReader xr = XMLReaderFactory.createXMLReader();
xr.setContentHandler( this );
xr.setErrorHandler( this );
xr.parse( new InputSource( new FileReader( filename )));

Что плохого в использовании этого метода для чтения XML-файла?

Переведено автоматически
Ответ 1

Похоже, что вы хотите использовать java.lang.Class.getResourceAsStream(String), смотрите

https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getResourceAsStream-java.lang.Строка-

Ответ 2

Вы не говорите, является ли это настольным компьютером или веб-приложением. Я бы использовал getResourceAsStream() метод из соответствующего загрузчика классов, если это рабочий стол, или контекст, если это веб-приложение.

Ответ 3

Похоже, что вы используете URL.toString результат в качестве аргумента FileReader конструктора. URL.toString немного сломан, и вместо него обычно следует использовать url.toURI().toString(). В любом случае строка не является путем к файлу.

Вместо этого вы должны либо:


  • Передайте URL в ServicesLoader и позвольте ему вызвать openStream или аналогичный.

  • Используйте Class.getResourceAsStream и просто передайте поток, возможно, внутри InputSource. (Не забудьте проверить наличие нулей, поскольку API немного запутан.)

Ответ 4

Проблема заключалась в том, что я зашел слишком далеко в вызове метода parse XmlReader . Метод parse принимает InputSource , поэтому не было причин даже использовать FileReader. Меняем последнюю строку приведенного выше кода на

xr.parse( new InputSource( filename ));

работает просто отлично.

java jar