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;

@Valuefile: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으로 읽기 

하지만 리소스 항아리 안에 있다고 가정해 보겠습니다 .

그런 다음 대신 ResourceInputStream 으로  읽을 수 있습니다 .

@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가 포함됩니다.

항상 그렇듯이 이 모든 예제는 GitHub에서 사용할 수 있습니다 .

Generic footer banner