Как загрузить XML-файл конфигурации с помощью FileInputStream, но получить исключение FileNotFoundException
-
18-09-2019 - |
Вопрос
Мой путь сборки в Eclipse выглядит так:
ProjectName
-- WEB-INF
-- classes
-- myClass.class
-- configs
-- myConfig.xml
Мой абсолютный путь к конфигурации сейчас выглядит так:
C:\Development\Java\ProjectName\WEB-INF\configs\myConfig.xml
Я использую JAXB для привязки, и он ожидает FileInputStream.FileInputStream должен быть потоком для файла конфигурации XML.Однако я не могу понять, как получить FileInputStream для моей конфигурации, и продолжаю получать исключение FileNotFoundException.
Я хочу, чтобы эта конфигурация загружалась таким образом, чтобы кому-то не приходилось жестко прописывать путь к конфигурации, потому что я планирую выпустить проект с открытым исходным кодом.Я вижу много примеров, когда кто-то просто жестко запрограммировал полный абсолютный путь, но мне нужно, чтобы это было что-то более гибкое, «например» следующее:
новый FileInputStream("/WEB-INF/configs/myConfig.xml");
Спасибо!
Решение
Я бы рекомендовал вместо этого поместить myConfig.xml в каталог WEB-INF/classes и загрузить его через загрузчик классов, поскольку он находится в пути к классам.Вызов getResourceAsStream() в контексте сервлета вернет входной поток, который вы можете использовать.Это относительно корня контекста, поэтому вы можете взять этот WAR и поместить его куда угодно — ваш код все равно будет работать.
Другие советы
Вы можете довольно легко получить входной поток относительных путей в WEB-INF с помощью ServletContext.getResourceAsStream()
метод (javadoc здесь) и его варианты.
Например, в вашем коде селвлета вы можете сделать это:
getServletContext().getResourceAsStream("/WEB-INF/configs/myConfig.xml") // your file
getServletContext().getResource("/WEB-INF") // URL to WEB-INF dir