class path에서 resource 찾기
String filename = "";
Thread.currentThread().getContextClassLoader().getResourceAsStream(filename);
가장 간단한 방법
ClassLoader.getSystemResource
자바에서는 resource 찾는 방법이 다양합니다.
모든 rresource는 URL로 정의된다. 로컬 디스크에서 찾는 리소스는 file:
// 스킴을 사용할 것이고 외부 리소스라면 http:// 라던가
//여러가지 sheme을 사용할 것이다.
오늘 이야기할 거리는 클래스 패스에서의 resource 찾는 방법이다.
클래스를 로딩하기 위해서는 class 파일을 바이트로 읽어 들여서 메모리에 로딩을 해야한다. 혹은 설정 파일이나 그림 파일들은 바이트로 읽기 위해서 InputStream을 얻어야 할 것이다. 즉, 클래스 패스에 존재하는 모든 클래스 파일들, 그림 파일, 사운드 파일, 설정 파일 등등 모든 파일들은 ClassLoader에서 찾아진다.
가장 간단하게 찾는 방법은!
ClassLoader.getSystemResource(name);
위와 같이 호출한다. 이는 완벽한 방법은 아닙니다. 바로 시스템 클래스로더를 사용하기 때문입니다.
우리가 사용하는 어플리케이션은 각 쓰레드마다 다른 클래스 로더를 사용할 수 있으므로 가장 좋은 방법은!
Thread.currentThread().getContextClassLoader().getResource(name);
위와 같이 하면 현재 실행 중인 쓰레드의 클래스 로더를 얻어와서 해당 클래스 로더에게 resource 찾는 일을 위임합니다.
여기서 클래스 로더의 작동 방식은 나중에 설명드리고 일단 resource 찾는 것에 집중하겠습니다.
resource name은 사용 규칙이 있습니다.
만일 net.loggable.config 라는 팩키지에 config.xml이라는 설정 파일이 있다면
net/loggable/config/config.xml
즉, 패키에서 .을 /로 변환한 것이라고 보면 되고 파일의 확장자를 다 적어주면 끝이다.
만일 root 패키지에 있는 log4j.xml을 찾고 싶다면
log4j.xml
즉, root는 파일명만 쓰면 됩니다.
이것 말고 또 하나는 방법은!
Class.getResource(name);
클래스에서 바로 resource를 얻어 오는 방법이 있다.
사용법은 클래스 로더에서 얻어 오는 방법과 동일하지만 resource name 규칙이 다르다.
/으로 시작하지 않으면 현재 포함된 패키지를 상대 결로로 하여 나머지 패키지 경로를 찾는다.
만일, net.loggable.config.xml 이란 패키지의 config.xml있고 net.loggable.config.Config 라는 클래스가 있다고 하면
이럴 경우 config.xml의 resource 명은 Config 클래스를 기준으로 하여
xml/config.xml이 된다.
그렇가면 root 패키지는..?
/log4j.xml
이렇게 /으로 시작하는 경우는 root 패키지 부터 하여 풀 네임을 사용할 수 있다.
/net/loggable/config/xml/config.xml
즉, Class로더는 상대결로를 root 패키지로 잡고 Class는 자신이 포함된 패키지를 기준으로 상대경로로 사용한다고 생각하면 된다.
추가로 현재 java를 실행한 work dir을 찾는 방법은????
System.getProperty("user.dir");
이렇게 하면 된다. 만일 실행 폴더에 같이 파일을 불러 들이고 싶으시다면 work dir을 사용하면 좋을 듯 합니다.
'JAVA' 카테고리의 다른 글
[JAVA] class 클래스 로딩 (0) | 2017.10.30 |
---|---|
[JAVA] class 동적로딩 (0) | 2017.10.30 |
[JAVA] cache function (0) | 2017.10.27 |
[JAVA] BigInteger형을 바이트 배열로!! (0) | 2017.10.27 |
[JAVA] application att (0) | 2017.10.27 |