2014-10-31 3 views
7
ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
URL url = classLoader.getResource("com/x/y/z.cfg"); 
File file = new File(url.getPath()); 

이것은 Eclipse에서 jar 파일을 실행할 때 작동하지만 jar 파일에서 실행할 때 작동하지 않습니다.classLoader.getResource가 jar 파일에서 작동하지 않습니다.

java.io.FileNotFoundException : 파일 : \의 C :! \ 사용자 노바 \ 바탕 화면 \ Matcher.jar \ \ C 톰 \ X \ Y \ z.cfg

이것은 아니다 중복. 다른 모든 질문을 확인했지만 유용한 정보는 없습니다.

+1

일단 '파일'을 가지고 있다면 어떻게해야할까요? JAR에서 자원에 대해 얻는'URL'로부터'File'을 생성 할 수 없습니다 ('file :'URL이 아니기 때문에 일반적으로'jar : file : /path/to/file.jar!/com/x/y/z.cfg'), 사용하는 API가'File' 대신에'URL' 또는'InputStream'을 받아 들일 수 있다면 당신은 그렇게 할 필요가 없습니다. –

+6

이것은 여러 번 설명됩니다 : [여기] (http://stackoverflow.com/questions/944610/how-do-i-access-a-config-file-inside-the-jar), [here] (http : //stackoverflow.com/questions/20389255/java-reading-a-resource-file-from-within-jar), [here] (http://stackoverflow.com/questions/403256/how-do-read -a-resource-file-from-java-jar-file? rq = 1). 왜냐하면 File은 파일 시스템 객체를 나타내며 jar의 내용은 파일 시스템에서 액세스 할 수 없기 때문입니다 (그러나 Java는 어떤 식 으로든이를 InputStream처럼 처리 할 수 ​​있습니다). –

+0

URL.getFile() *은 URL을 유효한 파일 경로로 변환하지 않습니다. URL의 경로 부분 만 반환합니다. (자바 1.0 시대에 대부분의 URL은 실제 파일을 참조 했으므로 그 이름은 getFile입니다.) – VGR

답변

11

파일이 항아리 안에 번들로 제공되면 파일이 일반 File 객체가 아닌 바이트 스트림이됩니다. 당신이 가진 유일한 파일은 JAR이기 때문에

InputStream stram=getClass().getClassLoader().getResourceAsStream(relativePath); 

More Tutorial...

당신은 파일의 인스턴스를 만들 수 없습니다 herehere

1

유사한 게시물을 읽어보십시오. 그것이 getResource()가 URL을 반환하는 이유입니다. URL.openStream() 메서드를 사용하여 내용을 읽을 수 있습니다.

관련 문제