Команда " java.io.File
and consorts" діє в файловій системі локального диска. Першопричиною вашої проблеми є те, що відносні шляхи в java.io
залежать від поточного робочого каталогу. Тобто каталог, з якого запускається JVM (у вашому випадку: той, що використовується у веб-сервера). Наприклад, це може бути C:\Tomcat\bin
щось зовсім інше, але, таким чином, ні, C:\Tomcat\webapps\contextname
або все, що ви очікуєте. У звичайному проекті Eclipse це було б C:\Eclipse\workspace\projectname
. Ви можете дізнатися про поточний робочий каталог наступним чином:
System.out.println(new File(".").getAbsolutePath());
Однак робочий каталог жодним чином не контролюється програмно. Вам слід віддати перевагу використовувати абсолютні шляхи в File
API, а не відносні шляхи. Напр C:\full\path\to\file.ext
.
Ви не хочете вводити жорсткий код чи здогадуватися про абсолютний шлях у Java (веб-додатках). Це лише проблема переносимості (тобто вона працює в системі X, але не в системі Y). Звичайна практика полягає в тому, щоб розмістити такі види ресурсів на classpath або додати його повний шлях до classpath (у IDE, як Eclipse, який є відповідною src
папкою та "path path"). Таким чином , ви можете отримати їх за допомогою об'єкта з ClassLoader
допомогою ClassLoader#getResource()
або ClassLoader#getResourceAsStream()
. Він здатний знаходити файли відносно "кореня" classpath, як ви за збігом обставин з'ясували. У Webapplications (або будь-який інший додаток, який використовує кілька завантажувачів класів) рекомендується використовувати ClassLoader
як повернуті Thread.currentThread().getContextClassLoader()
для цього, щоб ви могли виглядати "поза" контексту webapp.
Ще одна альтернатива веб-сайтів - це ServletContext#getResource()
та його аналог ServletContext#getResourceAsStream()
. Він може отримати доступ до файлів, розміщених у загальнодоступній web
папці проекту webapp, включаючи /WEB-INF
папку. ServletContext
Можна користуватися в сервлетах успадкованого getServletContext()
методу, ви можете назвати це як є.
Дивитися також: