И java.io.File
действует на локальной файловой системе диска. Основная причина вашей проблемы в том, что относительные пути в 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). Обычной практикой является размещение таких ресурсов в пути к классам или добавление их полного пути к пути к классам (в IDE, такой как Eclipse, это src
папка и «путь сборки» соответственно). Таким образом , вы можете получить их с помощью объекта с ClassLoader
помощью ClassLoader#getResource()
или ClassLoader#getResourceAsStream()
. Он может найти файлы относительно «корня» пути к классам, как вы случайно поняли. В веб-приложениях (или любых других приложениях, использующих несколько загрузчиков классов) рекомендуется использовать для этого ClassLoader
возвращаемое значение, Thread.currentThread().getContextClassLoader()
чтобы вы также могли смотреть «вне» контекста веб-приложения.
Другой альтернативой в веб-приложениях является ServletContext#getResource()
и его аналог ServletContext#getResourceAsStream()
. Он может получить доступ к файлам, расположенным в web
общей папке проекта webapp, включая эту /WEB-INF
папку. ServletContext
Доступен в сервлетах унаследованного getServletContext()
метода, вы можете назвать это как есть.
Смотрите также:
getResourceAsStream
это правильный способ сделать это для веб-приложений (как вы уже узнали).Причина в том, что чтение из файловой системы не может работать, если вы упакуете свое веб-приложение в WAR. Это правильный способ упаковки веб-приложения. Это переносимо, потому что вы не зависите от абсолютного пути к файлу или местоположения, где установлен ваш сервер приложений.
источник
FileInputStream загрузит путь к файлу, который вы передаете конструктору относительно рабочего каталога Java-процесса. Обычно в веб-контейнере это что-то вроде
bin
папки.getResourceAsStream()
загрузит путь к файлу относительно пути к классу вашего приложения .источник
FileInputStream
Класс работает непосредственно с основной файловой системой. Если рассматриваемый файл не присутствует там физически, он не сможет открыть его.getResourceAsStream()
Метод работает по- другому. Он пытается найти и загрузить ресурс, используяClassLoader
класс, к которому он обращен. Это позволяет ему, например, находить ресурсы, встроенные вjar
файлы.источник
jar
формате файла и его последствиях. И в Java соответствующиеClassLoader
могут обладать этими знаниями, тогда как в равной степени,FileInputStream
конечно, нет.classname.getResourceAsStream () загружает файл через загрузчик классов с именем класса. Если класс пришел из jar-файла, именно из него будет загружен ресурс.
FileInputStream используется для чтения файла из файловой системы.
источник
Я здесь, разделяя оба использования, помечая их как «Чтение файла» (java.io) и «Чтение ресурса» (ClassLoader.getResourceAsStream ()).
Чтение файлов - 1. Работает в локальной файловой системе. 2. Пытается найти файл, запрошенный из текущего каталога, запущенного JVM, от имени пользователя root 3. Идеально подходит для использования файлов для обработки в заранее определенном месте, например, / dev / files или C: \ Data.
Resource Read - 1. Работает с путем к классу 2. Пытается найти файл / ресурс в текущем или родительском пути к загрузчику классов. 3. Идеально подходит для загрузки файлов из упакованных файлов, таких как war или jar.
источник