1. 소개
이 사용방법(예제)에서는 Spring을 사용하여 클래스 경로에 있는 파일의 내용에 액세스하고 로드하는 다양한 방법을 보여줍니다.
2. 리소스 사용
자원 인터페이스는 낮은 수준의 리소스에 대한 액세스를 추출하는 데 도움이됩니다. 실제로 모든 종류의 파일 리소스를 균일한 방식으로 처리할 수 있도록 지원합니다.
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());
에서 유의 자원 , 우리가 쉽게와 같은 자바 표준 표현으로 이동할 수 의 InputStream 또는 파일 .
여기서 주목해야 할 또 다른 사항은 위의 방법이 절대 경로에서만 작동한다는 것입니다. 상대 경로를 지정하려면 두 번째 클래스 인수를 전달할 수 있습니다 . 경로는 이 클래스를 기준으로 합니다.
new ClassPathResource("../../../data/employees.dat", Example.class).getFile();
위의 파일 경로는 Example 클래스에 상대적 입니다.
2.2. @Value 사용
@Value를 사용하여 Resource 를 주입할 수도 있습니다 .
@Value("classpath:data/resource-data.txt")
Resource resourceFile;
@Value 는 file: 및 url: 과 같은 다른 접두사도 지원합니다 .
2.3. 리소스 로더 사용
리소스를 느리게 로드하려면 ResourceLoader 를 사용할 수 있습니다 .
@Autowired
ResourceLoader resourceLoader;
그런 다음 getResource를 사용 하여 리소스를 검색합니다 .
public Resource loadEmployeesWithResourceLoader() {
return resourceLoader.getResource(
"classpath:data/employees.dat");
}
너무 참고 위한 ResourceLoader가 모든 콘크리트에 의해 구현되는 ApplicationContext를 우리는 또한 단순히에 따라 달라질 수 있음을,의 어떤 수단을 ApplicationContext에 그 옷이 있다면 우리의 상황을 잘 :
ApplicationContext context;
public Resource loadEmployeesWithApplicationContext() {
return context.getResource("classpath:data/employees.dat");
}
3. ResourceUtils 사용
주의 사항으로 Spring에서 리소스를 검색하는 다른 방법이 있지만 ResourceUtils Javadoc 은 클래스가 주로 내부 사용을 위한 것임을 분명히 합니다.
코드에서 ResourceUtils의 사용법을 보면 :
public File loadEmployeesWithSpringInternalClass()
throws FileNotFoundException {
return ResourceUtils.getFile(
"classpath:data/employees.dat");
}
위의 표준 접근 방식 중 하나를 사용하는 것이 더 나을 수 있으므로 근거를 신중하게 고려해야 합니다 .
4. 리소스 데이터 읽기
리소스 가 있으면 내용을 쉽게 읽을 수 있습니다. 이미 논의한 바와 같이 Resource 에서 File 또는 InputStream 참조를 쉽게 얻을 수 있습니다 .
클래스 경로에 data/employees.dat 파일이 있다고 가정해 보겠습니다 .
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. InputStream으로 읽기
하지만 리소스 가 항아리 안에 있다고 가정해 보겠습니다 .
그런 다음 대신 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을 사용하여 클래스 경로에서 리소스에 액세스하고 리소스를 읽는 몇 가지 방법을 조사했습니다. 여기에는 열망 및 지연 로딩, 파일 시스템 또는 jar가 포함됩니다.