[Java] resource 디렉토리의 경로 가져오기
자바 애플리케이션은 resource 디렉토리에 정적 파일을 저장합니다.
이 때 파일의 경로를 알기 위해서는 resource 디렉토리의 경로가 필요합니다.
이 때 resource 디렉토리의 경로를 가져오기 위해 ClassLoader를 활용합니다.
꼭 클래스 로더에 대한 지식이 필요하진 않습니다. 다만 궁금하신 분은 이 글을 읽어주세요!
resource 디렉토리의 경로 가져오기
resource의 디렉토리를 가져오기 위해 ClassLoader에 있는 getResource() 메소드를 사용합니다.
public URL getResource(String name)
이 메소드는 주어진 이름을 가진 자원을 찾으려고 시도합니다.
먼저 리소스의 상위 클래스 로더에 위임합니다. 부모가 null 이면 가상 머신에 빌드된 클래스 로더의 경로를 검색합니다.
실패하면 메서드는 findResource(String) 를 호출 하여 리소스를 찾습니다. 입력으로 지정된 리소스 이름은 classpath에 대해 상대적이거나 절대적일 수 있습니다.
리소스를 읽기 위한 URL 개체를 반환하거나 리소스를 찾을 수 없거나 호출자가 리소스를 반환할 수 있는 적절한 권한이 없는 경우 null을 반환합니다.
Java는 클래스 경로에서 리소스를 로드한다는 점에 유의하는 것이 중요합니다.
마지막으로 Java에서 리소스 로드 는 환경이 리소스를 찾도록 설정되어 있는 한 코드가 실행되는 위치가 중요하지 않기 때문에 위치가 독립적인 것으로 간주됩니다. 즉 Java 환경이 리소스를 찾도록 설정되어 있다면 어느 위치에서 실행하든 위치와 관계없이 실행됩니다.
따라서 resource의 디렉토리 경로를 가져오기 위해서는 다음과 같이 할 수 있습니다.
URL resource = getClass().getClassLoader().getResource("리소스 이름");
String filePath = resource.getFile();
파일의 내용 읽기
리소스의 경로를 알아냈다면 파일의 내용을 읽을 수 있습니다.
URL resource = getClass().getClassLoader().getResource("리소스 이름") 로 리소스의 경로를 가져왔습니다.
Path path = new File(resource.getPath()).toPath();
List<String> contents = Files.readAllLines(path);
이렇게 진행하시면 파일 안에있는 모든 라인을 읽습니다. 단 Files.readAllLines() 메서드 내부적으로 UTF-8 로 디코딩을 진행합니다.