Ответ 1
java.io.File
и выполняет действия в локальной файловой системе на диске. Коренной причиной вашей проблемы является то, что относительные пути в java.io
зависят от текущего рабочего каталога. То есть каталог, из которого запускается JVM (в вашем случае: веб-сервер). Это может быть, например, C:\Tomcat\bin
или что-то совершенно другое, но, таким образом, не C:\Tomcat\webapps\contextname
или что бы вы ни ожидали. В обычном проекте Eclipse это будет C:\Eclipse\workspace\projectname
. Вы можете узнать о текущем рабочем каталоге следующим образом:
System.out.println(new File(".").getAbsolutePath());
Однако рабочий каталог никоим образом не управляется программным способом. Вы действительно должны использовать абсолютные пути в API File
вместо относительных путей. Например. C:\full\path\to\file.ext
.
Вы не хотите жестко кодировать или угадывать абсолютный путь в Java (веб-приложениях). Это проблема только переносимости (т.е. Она работает в системе X, но не в системе Y). Обычная практика заключается в размещении этих ресурсов в классе classpath или добавлении его полного пути к пути к классам (в среде IDE, такой как Eclipse, которая находится в папке src
и в "пути сборки" соответственно), Таким образом, вы можете захватить их с помощью ClassLoader
ClassLoader#getResource()
или ClassLoader#getResourceAsStream()
. Он может находить файлы по отношению к "корню" пути к классам, поскольку вы по совпадению выяснили. В web-приложениях (или любом другом приложении, использующем несколько загрузчиков классов) рекомендуется использовать ClassLoader
, как было указано Thread.currentThread().getContextClassLoader()
для этого, чтобы вы могли также посмотреть "вне" контекста webapp.
Другой альтернативой в webapps является ServletContext#getResource()
и ее копия ServletContext#getResourceAsStream()
. Он имеет доступ к файлам, находящимся в общедоступной папке web
проекта webapp, включая папку /WEB-INF
. ServletContext
доступен в сервлетах с помощью унаследованного метода getServletContext()
, вы можете назвать его как-есть.
См. также:
- Где разместить и как читать файлы ресурсов конфигурации в сервлет-приложении?
- Что означает servletcontext.getRealPath( "/" ) и когда следует использовать его
- Рекомендуемый способ сохранения загруженных файлов в приложении сервлета
- Как временно сохранить сгенерированный файл в веб-приложении на основе сервлетов