Доступ к файловой системе из java в Spring и tomcat

64
9

Я пытаюсь сделать некоторые xml-сортировки с помощью spring/tomcat... мое приложение развернуто как обычно, как военный файл. Файл действительно скопирован в правильное место WEB-INF/classes/myData.xml но я не уверен, как получить доступ к этому с помощью Java и, в частности, моего весеннего уровня обслуживания. Как обычно, я получаю файлы из контекста приложения.

Я хочу сделать это:

final File xml = new File("WEB-INF/classes/myData.xml");

но в моей dev build он переходит в F:\eclipse\WEB-INF\classes\myData.xml, а не в каталог развертывания внутри tomcat

спросил(а) 2021-01-25T18:35:24+03:00 4 месяца, 4 недели назад
1
Решение
118

Весной чистый способ сделать это с помощью Java - использовать ClasspathResource:

Resource myData = new ClasspathResource("myData.xml"):

В качестве альтернативы, если это компонент Spring, выполняющий эту работу, вы можете ввести его из XML, например

<property name="myResource" value="classpath:myData.xml"/>

... предполагая, что myResource - это свойство javabean на вашей Spring-компоненте типа Resource.

Каталог WEB-INF/classes автоматически находится в пути к классу сервера, вам не нужно (не следует) указывать это в пути явно.

Интерфейс Spring Resource предлагает различные способы захвата самих данных (например, getInputStream())

ответил(а) 2021-01-25T18:35:24+03:00 4 месяца, 4 недели назад
63

Если вы решили получить путь к вашему ресурсу, вы можете получить его URL-адрес, а затем проанализировать его, например:

    URL url = getClass().getResource("/WEB-INF/web.xml");
String path = url.toString();
if (path.startsWith("file:/")) {
path = path.substring("file:/".length());
File file = new File(path);
...do something with the file...
}

Существует, однако, оговорка: ваш ресурс может быть прочитан непосредственно из архива JAR, а не из плоского файла в вашей файловой системе и, следовательно, недоступен через объект File. Вышеупомянутый отлаженный работал в JBoss (который включает Tomcat), но JBoss взрывает архив WAR перед его развертыванием - не уверен, что это сделает чистый Tomcat.

Главный вопрос: почему вы действительно хотите получить ресурс в виде объекта File? Возможно, для вас достаточно URL-адреса? Или, может быть, вам просто нужен доступ для чтения?


Если вам нужен только доступ для чтения, самый простой способ получить любой ресурс в вашем пути к классам (например, вышеприведенный web.xml) - это просто вызвать:

InputStream in = getClass().getResourceAsStream("/WEB-INF/web.xml")

Если вам нужен доступ на запись к файлу, гораздо лучшим решением было бы предварительно настроить каталог (например, через web.xml), распаковать все необходимые вам файлы (например, с помощью метода getResourceAsStream выше), а затем редактировать и получать доступ к ним из вашего предопределенного каталога, который не зависит от вашего сервера приложений.

ответил(а) 2021-01-25T18:35:24+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема