Прочитать файл из каталога ресурсов

Научитесь читать файл из папки ресурсов в приложении Java. Мы научимся читать файл, присутствующий внутри файла jar, а также за пределами файла Jar. Файл за пределами файла jar может присутствовать как файл war или проект Eclipse в среде разработки.

1. Упаковка файла в папку ресурсов

Папка resources принадлежит структуре проекта Maven, где мы размещаем файлы конфигурации и данных, связанные с приложением. Расположение папки может быть «src/main/resources» и «src/test/resources».

  • При упаковке приложения в файл jar, файл, присутствующий в папке '/resources', копируется в корневую папку 'target/classes'. В этом случае местоположение файла находится внутри сжатого архива типа jar-filename.jar/!filename.txt. Мы должны напрямую прочитать этот файл как InputStream.
  • При упаковке приложения в виде файла war, файл, присутствующий в папке '/resources', копируется в корневую папку '/target/app-name'. После развертывания на сервере приложений файлы war извлекаются в рабочий каталог сервера. Таким образом, в этом случае мы читаем файл вне сжатого архива, поэтому мы можем ссылаться на файл, используя относительный путь. Мы можем ссылаться на этот файл, используя экземпляр File, и можем использовать любой подходящий метод для чтения содержимого файла.

В приведенных примерах мы считываем два файла в папке /resources. Первый файл /demo.txt находится в корне папки /resources. Второй файл /data/demo.txt находится внутри вложенной папки /data в папке resources.

Прочитать файл из каталога ресурсов0
Расположение файлов в папке ресурсов

2. Ресурсы, упакованные в файл .jar

2.1 Использование ClassLoader.getResourceAsStream()

Используйте метод getResourceAsStream() для получения InputStream при чтении файла из файла jar. Всегда используйте этот метод для экземпляра ClassLoader.

Этот код работает и в среде разработки.

private InputStream getFileAsIOStream(final String fileName){InputStream ioStream = this.getClass().getClassLoader().getResourceAsStream(fileName);if(ioStream == null) {throw new IllegalArgumentException(fileName + " is not found");}return ioStream;}

2.2 Полный пример

Получив ссылку InputStream, мы можем использовать ее для чтения содержимого файла или передачи его любому классу обработчика ресурсов.

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;public class ReadFileFromResourcesUsingGetResourceAsStream{public static void main(final String[] args) throws IOException{//Creating instance to avoid static member methodsReadFileFromResourcesUsingGetResourceAsStream instance= new ReadFileFromResourcesUsingGetResourceAsStream();InputStream is = instance.getFileAsIOStream("demo.txt");instance.printFileContent(is);is = instance.getFileAsIOStream("data/demo.txt");instance.printFileContent(is);}private InputStream getFileAsIOStream(final String fileName){InputStream ioStream = this.getClass().getClassLoader().getResourceAsStream(fileName);if(ioStream == null) {throw new IllegalArgumentException(fileName + " is not found");}return ioStream;}private void printFileContent(InputStream is) throws IOException{try(InputStreamReader isr = new InputStreamReader(is);BufferedReader br = new BufferedReader(isr);){String line;while((line = br.readLine()) != null) {System.out.println(line);}is.close();}}}

2.3 Как протестировать код

Чтобы протестировать приведенный выше код, упакуйте приложение как jar-файл с помощью команды 'mvn clean package'. Также укажите атрибут 'mainClass' для maven-jar-plugin и установите его значение для класса, который имеет метод main() и тестовый код.

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.2.0</version><configuration><archive><manifest><mainClass>com.howtodoinjava.io.ReadFileFromResourcesUsingGetResourceAsStream</mainClass></manifest></archive></configuration></plugin>

Теперь запустите метод main() из консоли.

mvn clean packagejava -jar target\app-build-name.jarContent from demo.txtContent from data/demo.txt 

3. Ресурсы, упакованные в файл .war

3.1 Использование ClassLoader.getResource()

Используйте метод getResource() для получения экземпляра File при чтении файла из файла war. Я предлагаю использовать этот метод на экземпляре ClassLoader.

private File getResourceFile(final String fileName){URL url = this.getClass().getClassLoader().getResource(fileName);if(url == null) {throw new IllegalArgumentException(fileName + " is not found 1");}File file = new File(url.getFile());return file;}

3.2 Полный пример

Теперь используйте ссылку Файл, чтобы прочитать содержимое файла.

package com.howtodoinjava.io;import java.io.BufferedReader;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.URL;import java.nio.file.Files;public class ReadFileFromResourcesUsingGetResource {public static void main(final String[] args) throws IOException{//Creating instance to avoid static member methodsReadFileFromResourcesUsingGetResource instance= new ReadFileFromResourcesUsingGetResource();File file = instance.getResourceFile("demo.txt");instance.printFileContent(file);file = instance.getResourceFile("data/demo.txt");instance.printFileContent(file);}private File getResourceFile(final String fileName){URL url = this.getClass().getClassLoader().getResource(fileName);if(url == null) {throw new IllegalArgumentException(fileName + " is not found 1");}File file = new File(url.getFile());return file;}private void printFileContent(File file) throws IOException{String content = new String(Files.readAllBytes(file.toPath()));System.out.println(content);}private void printFileContent(InputStream is) throws IOException{try(InputStreamReader isr = new InputStreamReader(is);BufferedReader br = new BufferedReader(isr);){String line;while((line = br.readLine()) != null) {System.out.println(line);}is.close();}}}

3.3 Как протестировать код

Чтобы протестировать приведенный выше код, упакуйте приложение как файл war с помощью команды mvn clean package. Используйте плагин maven-resources-plugin для копирования файлов из папки resources в корень архива файлов war.

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.2.0</version><configuration><failOnMissingWebXml>false</failOnMissingWebXml></configuration></plugin><plugin><artifactId>maven-resources-plugin</artifactId><version>2.4.3</version><executions><execution><id>copy-resources</id><phase>process-resources</phase><goals><goal>copy-resources</goal></goals><configuration><overwrite>true</overwrite><outputDirectory>${project.build.directory}/${project.artifactId}-${project.version}/</outputDirectory><resources><resource><directory>${project.basedir}/src/main/resources</directory></resource></resources></configuration></execution></executions></plugin>

Теперь запустите метод main из консоли. Не забудьте добавить классы в classpath.

mvn clean packagejava -classpath "classes/." com.howtodoinjava.io.ReadFileFromResourcesUsingGetResourceContent from demo.txtContent from data/demo.txt 

4. Использование ResourceUtils в приложениях Spring/Boot

Если приложение представляет собой приложение Spring WebMVC или Spring Boot, то мы можем воспользоваться классом org.springframework.util.ResourceUtils.

File file = ResourceUtils.getFile("classpath:demo.txt")//File is foundSystem.out.println("File Found : " + file.exists());//Read File ContentString content = new String(Files.readAllBytes(file.toPath()));System.out.println(content);
Прокрутить вверх