본문 바로가기
IT/Java

Resource 인터페이스 관련

by 성준하이 2024. 6. 16.
반응형

자바에서 사용되는 인터페이스 중에 Resource라는 이름을 가진 인터페이스가 있다.

공식 홈페이지에서 소개하는 글은 아래와 같다.

https://docs.spring.io/spring-framework/reference/core/resources.html

 

Resources :: Spring Framework

Java’s standard java.net.URL class and standard handlers for various URL prefixes, unfortunately, are not quite adequate enough for all access to low-level resources. For example, there is no standardized URL implementation that may be used to access a r

docs.spring.io

 

 

import org.springframework.core.io.Resource;

import 자체는 위 경로로 import 가 되고 내부를 살펴보면 아래 코드와 같다.

public interface Resource extends InputStreamSource {

    boolean exists();

    boolean isReadable();

    boolean isOpen();

    boolean isFile();

    URL getURL() throws IOException;

    URI getURI() throws IOException;

    File getFile() throws IOException;

    ReadableByteChannel readableChannel() throws IOException;

    long contentLength() throws IOException;

    long lastModified() throws IOException;

    Resource createRelative(String relativePath) throws IOException;

    String getFilename();

    String getDescription();
}

 

이미 InputStreamSource 를 상속 받고 있고 InputStreamSource 인터페이스는 아래와 같다.

public interface InputStreamSource {

    InputStream getInputStream() throws IOException;
}

 

Resource 인터페이스의 주요 메서드
  • getInputStream() : 자원을 탐색하여 열고 자원을 읽기 위해서 InputStream 타입으로 반환
  • exists() : 접근하고자 하는 자원이 존재하는지 확인
  • isOpen() : 해당 자원에 접근하고 있는 스트림이 있는지 여부를 확인.
    true라면 입력 스트림을 여러번 읽을 수 없으며, 자원 누수를 방지하기 위해 한번만 읽은 다음 닫아야 함.
    InputStreamResource를 제외한 모든 일반적인 자원 구현에 대해 false를 반환
  • getDescription() : 자원을 사용할때 오류 출력에 사용되는 설명을 반환.
    이것은 종종 자원의 정규화된 파일 이름 또는 실제 URL이 됨

 

대표적으로 Resource를 구현한 구현체들의 목록
UrlResource URL을 기준으로 리소스를 읽어들임 지원하는 프로토콜 http, https, ftp, file, jar
ClassPathResource 클래스패스를 기준으로 리소스를 읽어드림. classapth:  
FileSystemResource 파일시스템을 기준으로 리소스를 읽어드림.
ServletContextResource 웹 어플리케이션 루트에서 상대 경로로 리소스를 찾는다.

각 구현체의 테스트 예제 코드는 아래와 같으니 참고 바란다.

@Component
public class AppRunner implements ApplicationRunner {

    @Autowired
    ResourceLoader resoureLoader;

    @Override
    public void run(ApplicationArguments args) throws Exception {

        // ClassPathResource("")  = resourceLoader.getResource("classpath:")
        var cpr = new ClassPathResource("text.txt");
        // 존재 여부 
        System.out.println(cpr.exists());
        // classsPath
        System.out.println(cpr.getDescription());
        // txt 파일의 내용
        System.out.println(Files.readString(Path.of(cpr.getURI())));

        // resourceLoader
        Resource resource = resoureLoader.getResource("classpath:text.txt");
        System.out.println(resource.exists());
        System.out.println(resource.getDescription());
        System.out.println(Files.readString(Path.of(resource.getURI())));

        // FileSystemResource("")  = resourceLoader.getResource("file:")

        var fsr = new FileSystemResource("C:/thenicesj/spring/src/main/java/com/test/filetext.txt");
        System.out.println(fsr.exists());
        System.out.println(fsr.getDescription());
        System.out.println(Files.readString(Path.of(fsr.getURI())));


        // resourceLoader
        Resource resource2= resoureLoader.getResource("file:/C:/thenicesj/spring/src/main/java/com/test/filetext.txt");
        System.out.println(resource2.exists());
        System.out.println(resource2.getDescription());
        System.out.println(Files.readString(Path.of(resource2.getURI())));


    }
}
반응형

댓글