파일을 InputStream으로 로드하는 다양한 방법
전달된 파일 이름의 해석에는 미묘한 차이가 있습니다. 기본적으로 ClassLoader.getResourceAsStream()과 Class.getResourceAsStream()이라는 두 가지 메소드가 있습니다. 이 두 가지 메소드는 서로 다른 방식으로 리소스를 찾습니다.
Class.getResourceAsStream(path)에서 경로는 호출하는 클래스의 패키지 내의 경로로 해석됩니다. 예를 들어, String.class.getResourceAsStream("myfile.txt")을 호출하면 "java/lang/myfile.txt" 위치의 클래스 경로에서 파일을 찾습니다. 경로가 /로 시작하면 절대 경로로 간주되어 클래스 경로의 루트부터 검색이 시작됩니다. 따라서 String.class.getResourceAsStream("/myfile.txt")을 호출하면 클래스 경로에서 다음 위치를 확인합니다. ./myfile.txt.
ClassLoader.getResourceAsStream(path)은 모든 경로를 다음과 같이 간주합니다. 절대 경로. 따라서 String.class.getClassLoader().getResourceAsStream("myfile.txt") 및 String.class.getClassLoader().getResourceAsStream("/myfile.txt")을 호출하면 두 경우 모두 클래스 경로의 파일을 찾는 다음 위치: ./myfile.txt.
이 게시물에서 위치를 언급할 때마다 해당 위치가 될 수 있습니다. 리소스를 로드하는 클래스 및/또는 ClassLoader에 따라 파일 시스템 자체 또는 해당 JAR 파일의 위치.
귀하의 경우 애플리케이션 서버에서 클래스를 로드하므로 this.getClass().getClassLoader().getResourceAsStream(파일 이름) 대신 Thread.currentThread().getContextClassLoader().getResourceAsStream(파일 이름)을 사용해야 합니다. this.getClass().getResourceAsStream()도 작동합니다.
이 특정 문제에 대한 자세한 내용은 이 문서를 읽어보세요.
Tomcat 7 이하 사용자를 위한 참고 사항
이 질문에 대한 답변 중 하나는 Tomcat 7에 대한 설명이 잘못된 것 같다는 것입니다. 왜 그럴지 알아보려고 노력 중이었습니다.
그래서 다양한 Tomcat 버전에 대한 Tomcat의 WebAppClassLoader 소스 코드를 살펴보았습니다. 요청된 리소스에 대한 URL을 궁극적으로 담당하는 findResource(문자열 이름)의 구현은 Tomcat 6과 Tomcat 7에서 거의 동일하지만 Tomcat 8에서는 다릅니다.
버전 6 및 7에서는 구현 시 리소스 이름을 정규화하려고 시도하지 않습니다. 이는 이러한 버전에서 classLoader.getResourceAsStream("/resource.txt")가 classLoader.getResourceAsStream("resource.txt")와 동일한 결과를 제공하지 않을 수 있음을 의미합니다(Javadoc에 명시된 대로). [소스코드]
단, 버전 8에서는 리소스 이름의 절대 버전이 사용되도록 리소스 이름을 정규화합니다. 따라서 위에서 설명한 두 호출은 Tomcat 8에서 항상 동일한 결과를 생성해야 합니다. [소스코드]
따라서 Tomcat 8 이전 버전에서 ClassLoader.getResourceAsStream() 또는 Class.getResourceAsStream()을 사용할 때는 각별히 주의가 필요합니다. 또한 class.getResourceAsStream("/resource.txt")이 실제로 classLoader.getResourceAsStream("resource.txt")을 호출한다는 점도 명심해야 합니다(앞의 /가 제거됨).
위 내용은 파일을 입력스트림으로 로드할 때 `ClassLoader.getResourceAsStream()`과 `Class.getResourceAsStream()`은 어떻게 다릅니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!