2019년 8월 6일 화요일

getResource() vs getClassLoader().getResource()

getResource(), getResourceAsStream()는 지정된 이름의 리소스를 찾는 API다. 주어진 클래스와 관련된 리소스를 검색하는 규칙은 클래스의 클래스 로더 구현을 따른다. 만약 객체가 부트스트랩 클래스 로더에 의해 로드되었다면 이 메서드는 작업을 ClassLoader.getsystemResourceAsStream(java.lang.String)으로 위임시킨다.


getClass().getResource() vs getClass().getClassLoader().getResource()

getClass().getResource()는 호출한 클래스 패키지로 기준한 상대적인(relative) 리소스 경로로 리소스를 탐색하게 되고, getClass().getClassLoader().getResource()는 항상 절대적인(absolute) 리소스 경로로 리소스를 탐색하게 된다. 예외 규칙으로 getClass().getResource()로 전달하는 리소스 이름이 '/'로 시작하면 getClassLoader() 방식과 같이 절대 리소스 경로로 처리된다.

아래의 결과는 같다.
foo.bar.Baz.class.getResource("xyz.txt");
foo.bar.Baz.class.getClassLoader().getResource("foo/bar/xyz.txt");
아래도 같다. getClass().getResource()로 전달된 리소스 이름이 '/'로 시작하기 때문에 절대 리소스 경로로 처리된다.
foo.bar.Baz.class.getResource("/data/xyz.txt");
foo.bar.Baz.class.getClassLoader().getResource("data/xyz.txt");
[원문] https://stackoverflow.com/questions/6608795/what-is-the-difference-between-class-getresource-and-classloader-getresource


getResource() vs getResourceAsStream()

내부 동작 방식은 같은데 getResource()는 URL 객체를 반환하고, getResourceAsStream()은 InputStream 객체를 반환한다.


new FileInputStream 등으로 파일을 직접 읽지 않고 getResource(), getResourceAsStream()을 사용하는 이유

getResource(), getResourceAsStream()을 쓰면 jar로 패키징된 내부 파일을 직접 읽을 수 있다.


[참고] 자바 클래스 로더 (Java Class Loader)
https://blog.naver.com/seokcrew/221608650295

댓글 없음:

댓글 쓰기