클래스 경로 리소스 (XML 파일)에서 입력 스트림 가져 오기


81

Java 웹 애플리케이션에서 CLASSPATH (즉, 소스 폴더 내부)에있는 XML 파일의 InputStream을 가져 오려면 어떻게해야합니까?

답변:


99

ClassLoader.getResourceAsStream().

아래 주석에서 언급했듯이 다중 ClassLoader환경 (예 : 단위 테스트, 웹앱 등)에있는 경우을 사용해야 할 수 있습니다 Thread.currentThread().getContextClassLoader(). http://stackoverflow.com/questions/2308188/getresourceasstream-vs-fileinputstream/2308388#comment21307593_2308388을 참조 하십시오 .


코드 예를 들어 개인 게시물을 참조 : tshikatshikaaa.blogspot.nl/2012/07/...을
제롬 Verstrynge에게

14
다중 클래스 로더 환경 (예 : 단위 테스트 / 웹 앱 등)에있는 경우이 Thread.currentThread (). getContextClassLoader ()를 사용해야 할 수 있습니다. stackoverflow.com/questions/2308188/…을
khylo 2013

답변에 @khylo의 제안을 추가하십시오!
froginvasion

8
또 다른 방법 :InputStream is = new ClassPathResource("/path/to/your/file").getInputStream()
zhuguowei

1
@zhuguowei ClassPathResource는 Spring 클래스입니다.
ichalos

31
ClassLoader.class.getResourceAsStream("/path/file.ext");

그러나이 방법 바람둥이에 배포 웹 응용 프로그램 오류가 발생합니다 경우 : java.lang.NullPointerException: null , 내가 생각하는 가장 간단한 방법입니다new ClassPathResource("/path/to/your/file").getInputStream()
zhuguowei

당신은 O 전쟁에서 사용할 수 있도록하는 방법을 알려 주시기 바랍니다 수 있습니다
비 크람 Saini에게

배포 할 때 동일한 문제가 발생했습니다. 누구든지이 상황에 대한 해결책을 찾을 수 있습니까?
Augusto

12

그것은 정확히 XML 파일이 어디에 있는지에 달려 있습니다. 소스 폴더 ( "기본 패키지"또는 "루트")에 있습니까? 아니면 클래스와 같은 폴더에 있습니까?

전자의 경우 /file.xml파일을 찾기 위해 " "(선행 슬래시에주의)를 사용해야 하며 파일을 찾으려고 시도하는 데 사용하는 클래스는 중요하지 않습니다.

XML 파일이 클래스 옆에 있으면 파일 SomeClass.class.getResourceAsStream()이름 만 사용하면됩니다.


11

ClassLoader.class.getResourceAsStream("/path/to/your/xml") 컴파일 스크립트가 CLASSPATH에 xml 파일을 복사하고 있는지 확인하십시오.


6

someClassWithinYourSourceDir.getClass (). getResourceAsStream ();


또는 getClass().getResourceAsStream("...")기타
rogerdpack

4

이 답변의 "getResourceAsStream ()"옵션 중 일부는 저에게 작동하지 않았지만이 옵션은 작동했습니다.

SomeClassWithinYourSourceDir.class.getClassLoader (). getResourceAsStream ( "yourResource");


0

제안 된 솔루션을 시도했지만 파일 이름에 슬래시가 작동하지 않았습니다. 예 : ... (). getResourceAsStream ( "/ my.properties"); null이 반환되었습니다.

슬래시 제거가 작동했습니다. .... getResourceAsStream ( "my.properties");

다음은 doc API에서 가져온 것입니다. 위임 전에이 알고리즘을 사용하여 주어진 리소스 이름에서 절대 리소스 이름이 구성됩니다.

If the name begins with a '/' ('\u002f'), then the absolute name of the resource is the portion of the name following the '/'.
Otherwise, the absolute name is of the following form:

    modified_package_name/name 

Where the modified_package_name is the package name of this object with '/' substituted for '.' ('\u002e'). 

내 경우에는 내가지고 있다고 null 없이/ . 슬래시 문자를 추가하면 저에게 효과적이었습니다. @ hussein-terek과 내 설정 및 설정 사이에 다른 차이점이 있어야합니다.
Ajoy Bhatia
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.