Использование методов File API для файлов, расположенных на моем сервере

#java #tomcat #servlets #file-io

#java #tomcat #сервлеты #file-io

Вопрос:

Я создал небольшое приложение, которое просматривает мою файловую систему, чтобы создать и отобразить ее в виде дерева (JTree). Теперь я хочу сделать то же самое для моих файлов, присутствующих на моем сервере. У меня есть сервер Apache Tomcat. То, что я хочу сделать, это что-то вроде :

 File dir = new File(new URI("file://localhost:8084/myapp/Dir"));

  File[] files = dir.listFiles();

    for (File f : files) {
        System.out.println(f.getAbsolutePath());
  

это всего лишь пример, но я хочу использовать java File API.

Я получаю эту ошибку, когда помещаю этот код в сервлет :

11 mai 2011 10:02:15 org.apache.catalina.core.StandardWrapperValve invoke "Servlet.service()" pour la servlet tests a généré une exception
java.lang.IllegalArgumentException: URI has an authority component
at java.io.File.<init>(File.java:385)

Я не знаю, что это значит.

Я также пробовал File dir = new File("Dir") ; и File dir = new File("web/Dir") и даже File dir = new File(new URI(http://localhost:8084/myapp/Dir ));

но каталог не найден. Я не понимаю этого и схожу с ума (хм .. извините).

когда я набираю http://localhost:8084/myapp/Dir в своем веб-браузере, отображается содержимое каталога.Итак, каталог действительно включен http://localhost:8084/myapp /

Мне действительно действительно нужна некоторая резервная копия здесь. Заранее спасибо.

Ответ №1:

Предполагая, что ваше веб-приложение развернуто как распакованный war, тогда вы можете использовать getRealPath() on ServletContext объект для получения реального пути файловой системы для заданного пути веб-приложения.

Итак, изнутри вашего сервлета:

 File dir = new File(getServletContext().getRealPath("/Dir"));
  

Смотрите javadoc.

Обратите внимание, что это не очень хорошая практика и не будет работать на любом сервере приложений, который не распаковывает свои WARs в файловую систему перед ее запуском (например, Google App Engine).

Комментарии:

1. Спасибо за ваш быстрый ответ. Это работает. Выглядит нормально, я буду работать над этим.

2. Есть ли какое-либо лучшее решение? например, для движка приложений Gooogle.

3. @lemoos: Не для GAE, нет, это очень ограниченная среда.