JAVA를 사용하여 파일을 얻는 것은 간단해 보이지만 저와 같은 많은 초보자에게는 여전히 매우 얕고 사용 경험이 매우 심오합니다. 가장 일반적으로 사용되는 방법은 JAVA의 File 클래스를 사용하는 것입니다. c :/test.txt 파일을 사용하려면 File file = new File("c:/test.txt"); 이 사용의 문제점은 무엇입니까? JAVA의 경우 경로가 하드 코딩되어 있다는 것을 모두가 알고 있다고 생각합니다. 정신, 애플리케이션 한 번만 구성하면 어디에서나 사용할 수 있어야 하며 실제 애플리케이션 측면에서 최종 생성된 애플리케이션은 Windows 이외의 운영 체제에도 배포됩니다. Linux의 경우 애플리케이션에 c:/라는 단어를 사용하면 실패를 의미하므로 , 하드 코딩을 피해야 합니다. 즉, 절대 경로를 직접 사용해야 합니다.
서블릿 애플리케이션에는 getRealPath(String str) 메서드가 있습니다. 이 메서드도 절대 경로를 직접 작성하지 않고도 파일의 경로를 동적으로 얻을 수 있지만 이 메서드도 권장되지 않습니다. 파일을 얻는 더 좋은 방법이 있나요?
Class.getResource() 및 Class.getResourceAsStream() 메서드가 있지만 많은 사람들이 아직 그 사용법을 이해하지 못합니다. 물론 어떤 사람들은 이미 그것을 능숙하게 사용해왔고, 이 사람들은 그것을 처리할 필요가 없습니다. 그렇지 않은 사람들을 위해 여기서는 조금 설명하겠습니다. 알고 있거나 별로 익숙하지 않습니다.
먼저 Java에는 다음과 같은 getResourceAsStream 유형이 있습니다:
1. Class.getResourceAsStream(문자열 경로): 경로가 '/'로 시작하지 않는 경우 기본값은 리소스를 가져오는 패키지에서 가져오는 것입니다. 이 클래스는 '/'로 시작하는 경우
ClassPath 루트에서 가져옵니다. path를 통해 절대 경로를 구성할 뿐이며, 궁극적으로 ClassLoader가 리소스를 얻습니다.
2. Class.getClassLoader.getResourceAsStream(String path): 기본적으로 ClassPath 루트에서 가져옵니다. 경로는 '/'로 시작할 수 없습니다. 마지막으로 ClassLoader는 리소스를 가져옵니다.
3. ServletContext.getResourceAsStream(String path): 기본적으로 Tomcat에서 경로가 '/'로 시작하는지 여부는 중요하지 않습니다. 컨테이너 구현.
4. Jsp 아래의 애플리케이션 내장 객체는 위의 ServletContext를 구현한 것입니다.
그런데 JAVA에는 3개의 로더가 있습니다.
총 3개의 로더가 있습니다.
bootstrap 클래스 로더: JAVA 핵심 클래스(jre 아래의 lib 및 클래스 디렉터리에 있는 콘텐츠) 로드를 담당합니다.
확장 클래스 로더: JAVA 확장 클래스(jre 아래 lib/ext 디렉터리의 내용) 로드를 담당합니다.
동시에 사용자는 특별한 리소스를 로드하기 위해 자신만의 ClassLoader를 정의할 수도 있습니다.
이것은 Class.getClassLoader()와 Thread.currentThread.getContextClassLoader()의 차이점과 관련이 있습니다.
간단한 예를 들어보겠습니다.
어느 날 JAVA가 컴퓨터의 표준 카메라를 시작하기 위해 StartCamera라는 클래스를 제공하고 이 클래스를 항아리에 패키징한다고 가정해 보겠습니다.
일반적인 상황에서 카메라를 시작하려면 이 jar를 클래스 경로에 구성하기만 하면 됩니다. 시스템 클래스로더는 시스템이 시작될 때 이 클래스를 애플리케이션에 로드합니다.
하지만 카메라 제조업체가 다르기 때문에 새 장치에 대해 다양한 StartCamera 구현이 있을 것입니다. 애플리케이션에서는 실제 사용자가 어떤 것을 사용할지 알 수 없습니다. 그래서 우리는 특정 장치 유형에 해당하는 StartCamera 클래스를 로드하도록 ClassLoader를 사용자 정의했습니다.
이런 식으로 나타납니다. 먼저 정의한 클래스를 로드한 다음 로드할 수 없는 경우 시스템 클래스를 로드합니다. 이러한 요구는 시스템의 기본
부모 위임 로딩 메커니즘
으로 충족될 수 없습니다. Thread.currentThread.getContextClassLoader()가 생성되는 방식입니다. Thread.currentThread.setContextClassLoader()를 사용하여 현재 스레드에 해당하는 ClassLoader를 지정한 다음 get 메서드를 사용하여 이를 얻습니다.
위 내용은 Java에서 getResourceAsStream 사용법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!