2011-02-28 4 views

답변

8

App.class.getResourceAsStream(resource) 검색 등 클래스 (App 클래스가 패키지 com.yourcompany에있는 경우 com/yourcompany/test.properties)를 검색합니다. 귀하의 상황에서 당신은 슬래시를 앞에 추가 또는 대신 클래스의 클래스 로더를 사용해야 중 하나

A)

App.class.getResourceAsStream("/test.properties") 

B)

App.class.getClassLoader().getResourceAsStream("test.properties") 
+0

나를 위해 파일이 항아리에 없습니다. 응용 프로그램을 정리/다시 빌드하면 문제가 해결됩니다. – emrahgunduz

1

test.properties 파일을 찾을 수 없습니다.

1

원인은 대개 파일을 찾을 수 없다는 것입니다. (드물게 앱에 읽기 권한이 없다는 것입니다.) 일반적인 문제는 선도 경로 표시기 (아마도 단지 /)가 필요하다는 것입니다. 기본 검색은 App 클래스의 클래스 로더를 기반으로하며 아마도 원하는 것은 아닙니다.

+1

내 클래스에서 하위 폴더에서 액세스 할 수있는 컴/없음/내 특성에 있습니다 루트 directory.anything에서 잘못? – user496949

+0

무엇의 루트 디렉토리? 프로젝트 또는 파일 시스템? (getResourceAsStream으로 열려면 프로젝트의 일부 여야합니다.) 파일 이름에 선행하는'/'을 넣고 무슨 일이 일어나는 지 봅니다. 당신이 묘사 한 바에 따르면 그것은 잘 작동 할 것입니다. –

3

은 "실제 디렉토리는"당신의 클래스에있는 폴더/패키지에 올바른 사용 :.

InputStream is = App.class.getResourceAsStream(“../../test.properties”); 

아니면 : 같은 계층의 자원에 대한

InputStream is = App.class.getResourceAsStream(“/test.properties”); 
+0

+1 ../때로는 도움이 될 수 있고 그것에 대해 생각해 본 다른 사람이 없습니다 –

1

하는 ./test 확인하는 방법 .properties가 클래스 경로에 있습니까?

나는 당신이 실제로 클래스 패스가 무엇인지, 그리고 어떻게 설정되어 있는지를 알고 있다고 가정한다. 그리고 그것은 어떤 클래스 로더 이죠. 그렇다면 ...

클래스 경로는 "/ a/b/c/d"또는 "/some/pkg/SomeClass.class"와 같은 계층 적 이름을 가진 리소스의 네임 스페이스를 정의합니다. 이것을 클래스 로더 네임 스페이스이라고합니다. getResourceAsStream(path) 메서드를 호출하면 클래스 로더가 클래스 로더 네임 스페이스 ...에있는 경로가 path으로 지정된 리소스를 찾은 다음 리소스를 읽는 데 필요한 바이트 스트림을 반환하도록 클래스 로더에게 지시합니다.

경로는 두 가지가 있습니다. 절대 경로는 "/"로 시작하고 상대 경로는 "/"이외의 다른 문자로 시작합니다.

  • 당신이 절대 경로 (예 : "https://stackoverflow.com/a/b/test.properties"를 사용하는 경우, 당신은 절대 경로 클래스 로더 네임 스페이스에 당신이 준 경로와 동일한 자원을 얻을 것이다.

  • 이 경우 당신이

    import some.pkg.App; // for instance 
    
    App.class.getResourceAsStream("test.properties"); 
    

    을 사용하는 상대 경로 (예 : "test.properties") 당신이 그것을로드되는 상황에, 다음 상대 경로가 해결 될 때 상대를. 사용하는 경우 경로 이름을 해석하기위한 컨텍스트는의 경로 이름이됩니다.클래스 패키지; 즉 "/ some/pkg"입니다. 따라서 클래스 로더는 네임 스페이스의 절대 이름이 "/some/pkg/test.properties"인 리소스를 찾습니다. (패키지 이름에서 클래스 로더 네임 스페이스의 경로 이름으로의 매핑은 패키지 FQN의 "."구분 기호를 "/"구분 기호로 대체하는 것과 관련이 있습니다.)

    다른 처리기에서는 클래스 로더 핸들을 직접 사용하여 리소스를로드하는 경우; 예 :

    App.class.getClassLoader().getResourceAsStream("test.properties"); 
    

    (가) 위의 "/test.properties"... 네임 스페이스에 해결할 클래스 로더가 사용하는 "/"문맥으로, 그래서.

"test.properties"파일을 어디에 넣을지 고쳐야합니다. 그러면 사용중인 호출에서 찾을 수 있습니다. 또는 절대 이름을 사용할 수 있습니다.

0

그런 일을 피하려면 모든 속성 파일을 루트 컨텍스트에 두는 것이 좋습니다. 그래서 당신이

App.class.getResourceAsStream("/test.properties") 
관련 문제