[JAVA] Java Resource 사용(getResource(),getResourceAsStream())

2020. 12. 28. 01:55백엔드/JAVA

728x90

*이클립스에서는 정상적으로 Properties파일 경로를 읽어오는데, .exe파일 실행시 Properties경로를 못읽어오는 문제가 발생하였는데, 결론적으로 getResourceAsStream() 를 적용하니 정상실행됨.

 


기본폴더구조

src/main/java 폴더 하위에 있는 java파일은 빌드 후 target/classes하위에 위치하게 되고,

src/main/resources/static 폴더는 빌드 후 target/static하위에 위치하게됨.

결국, 자바 파일이던 그 외 파일이던 결국 빌드 후에는 target 디렉터리가 루트 디렉터리가 됨.

 


getResurce()

-이클립스에서 실행시

resourceURL값이 'file:'로 시작.

fileLocation경로는 파일시스템에 실제 존재하는 경로와 일치.

public static void main(String[] args) {
        URL resourceURL = new PropConfig().getClass().getResource("conf.properties");
        System.out.println("[ resourceURL ] "+ resourceURL);
       
        String fileLocation = resourceURL.getFile();
        System.out.println("[ fileLocation ] "+fileLocation);
 }
    

 

 

-.exe(혹은 .jar)파일 실행시

아래와 같이 에러가 발생하는데 중간에 보면 'exeTest.exe!'로 표시되어 있는데, 이렇게 '!'가 포함된 경로는 실제로 존재하지 않기 때문에 에러가 발생.

따로 로그는 없지만, 참고로 .exe파일 실행시 resourceURL값이 'jar:file:'로 시작.

java.io.FileNotFoundException: file:\C:\Users\Desktop\exeTest.exe!\conf.properties 

 

즉, 이클립스에서 실행할 때는 실제 파일시스템 기준 경로를 따르므로 에러가 발생하지 않지만, .exe(.jar)파일을 읽을 때는 .exe(.jar)파일이 '!'와 함께 표시되기 때문에 실제 파일싯템 경로에 맞지 않아 에러가 발생함.

이클립스에서는 resourceURL값이 'file:'로 시작했는데, .exe(.jar)파일로 실행할 때는 'jar:file:'로 시작함.

 

 


getResourceAsStream()

결론적으로, getResourceAsStrem()을 사용하는 것이 편함.

일반 디렉토리이건, jar파일과 같이 묶여 있는 파일에서건 해당 디렉토리 파일을 읽을 경우 모두 사용이가능함

getResource()는 기본적으로 URL을 반환하는데, URL은 위와 같이 .exe(.jar)파일을 '!'와 함께 표시하기 때문에, jar실행시 에러가 발생함.

하지만 getResourceAsStream()은 InpuStream을 반환함. 그리고 Java9에서 추가된 InputStream.readAllByter()를 사용하면 편리하게 InputStream을 읽어서 byte[]에 저장할 수 있음.(대용량 데이터는 처리안됨)

 

 

 

 

 

 

 

 

 

 

출처 :

homoefficio.github.io/2020/07/21/IDE-%EC%97%90%EC%84%9C%EB%8A%94-%EB%90%98%EB%8A%94%EB%8D%B0-jar-%EC%97%90%EC%84%9C%EB%8A%94-%EC%95%88-%EB%8F%BC%EC%9A%94-Java-Resource/

참고  :

egloos.zum.com/aploit/v/4811787

iamfreeman.tistory.com/entry/getClassgetResourcedataheaddat-vs-getClassgetResourceAsStreamdataheaddat

 

728x90