Рубрики
Без рубрики

Доступ к файлу из пути к классам в приложении Spring

Узнайте, как легко открыть и прочитать файл в пути к классам с помощью API ресурсов Spring

Автор оригинала: baeldung.

1. введение

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

Дальнейшее чтение:

Руководство по связке ресурсов

Загрузите ресурс в виде строки весной

2. Использование ресурса

Интерфейс Resource помогает абстрагировать доступ к низкоуровневым ресурсам. Фактически, он поддерживает единообразную обработку всех видов файловых ресурсов.

Давайте начнем с рассмотрения различных методов получения экземпляра Resource .

2.1. Вручную

Для доступа к ресурсу из пути к классам мы можем просто использовать ClassPathResource :

public Resource loadEmployeesWithClassPathResource() {
    return new ClassPathResource("data/employees.dat");
}

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

Однако мы также можем указать загрузчик классов для использования либо напрямую:

return new ClassPathResource("data/employees.dat", this.getClass().getClassLoader());

Или косвенно через указанный класс:

return new ClassPathResource(
  "data/employees.dat", 
  Employee.class.getClassLoader());

Обратите внимание , что из Resource мы можем легко перейти к стандартным представлениям Java, таким как InputStream или Файл .

Еще одна вещь, которую следует отметить здесь, заключается в том, что приведенный выше метод работает только для абсолютных путей. Если мы хотим указать относительный путь, мы можем передать второй аргумент class . Путь будет относительно этого класса:

new ClassPathResource("../../../data/employees.dat", Example.class).getFile();

Приведенный выше путь к файлу относится к классу Example //.

2.2. Использование @Value

Мы также можем ввести Ресурс с @Value :

@Value("classpath:data/resource-data.txt")
Resource resourceFile;

@Value поддерживает и другие префиксы, такие как file: и url: .

2.3. Использование ResourceLoader

Если мы хотим лениво загружать наш ресурс, мы можем использовать ResourceLoader :

@Autowired
ResourceLoader resourceLoader;

Затем мы извлекаем наш ресурс с помощью getResource :

public Resource loadEmployeesWithResourceLoader() {
    return resourceLoader.getResource(
      "classpath:data/employees.dat");
}

Обратите также внимание, что ResourceLoader реализован всеми конкретными ApplicationContext s, что означает, что мы также можем просто зависеть от ApplicationContext , если это лучше соответствует нашей ситуации:

ApplicationContext context;

public Resource loadEmployeesWithApplicationContext() {
    return context.getResource("classpath:data/employees.dat");
}

3. Использование ресурсов

В качестве предостережения, есть еще один способ извлечения ресурсов весной, но ResourceUtils Javadoc ясно, что класс предназначен в основном для внутреннего использования.

Если мы видим использование ResourceUtils в нашем коде:

public File loadEmployeesWithSpringInternalClass() 
  throws FileNotFoundException {
    return ResourceUtils.getFile(
      "classpath:data/employees.dat");
}

Мы должны тщательно рассмотреть обоснование, так как вероятно, лучше использовать один из стандартных подходов выше .

4. Чтение Данных Ресурсов

Как только у нас есть Ресурс, нам легко прочитать его содержимое. Как мы уже обсуждали, мы можем легко получить Файл или Входной поток ссылку из Ресурса .

Давайте представим, что у нас есть следующий файл data/employees.данные , по пути к классу :

Joe Employee,Jan Employee,James T. Employee

4.1. Чтение в виде файла

Теперь мы можем прочитать его содержимое, вызвав GetFile:

@Test
public void whenResourceAsFile_thenReadSuccessful() 
  throws IOException {
 
    File resource = new ClassPathResource(
      "data/employees.dat").getFile();
    String employees = new String(
      Files.readAllBytes(resource.toPath()));
    assertEquals(
      "Joe Employee,Jan Employee,James T. Employee", 
      employees);
}

Хотя следует отметить, что при таком подходе ожидается, что ресурс будет присутствовать в файловой системе, а не в файле jar.

4.2. Чтение в качестве входного потока

Допустим, однако, что наш ресурс находится внутри банки.

Тогда мы можем вместо этого прочитать Resource как InputStream :

@Test
public void whenResourceAsStream_thenReadSuccessful() 
  throws IOException {
    InputStream resource = new ClassPathResource(
      "data/employees.dat").getInputStream();
    try ( BufferedReader reader = new BufferedReader(
      new InputStreamReader(resource)) ) {
        String employees = reader.lines()
          .collect(Collectors.joining("\n"));
 
        assertEquals("Joe Employee,Jan Employee,James T. Employee", employees);
    }
}

5. Заключение

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

Как всегда, все эти примеры доступны на GitHub .