Команда " java.io.Fileand consorts" діє в файловій системі локального диска. Першопричиною вашої проблеми є те, що відносні шляхи в java.ioзалежать від поточного робочого каталогу. Тобто каталог, з якого запускається JVM (у вашому випадку: той, що використовується у веб-сервера). Наприклад, це може бути C:\Tomcat\binщось зовсім інше, але, таким чином, ні, C:\Tomcat\webapps\contextname або все, що ви очікуєте. У звичайному проекті Eclipse це було б C:\Eclipse\workspace\projectname. Ви можете дізнатися про поточний робочий каталог наступним чином:
System.out.println(new File(".").getAbsolutePath());
Однак робочий каталог жодним чином не контролюється програмно. Вам слід віддати перевагу використовувати абсолютні шляхи в FileAPI, а не відносні шляхи. Напр 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()методу, ви можете назвати це як є.
Дивитися також: