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 .