리소스 파일을 로드하는 데 일반적으로 사용되는 두 가지 방법이 있습니다.
1. ClassLoader를 사용하세요. 여기서 ClassLoader의 분류에 대해 언급해야 합니다. Java에 내장된 ClassLoader에는 세 가지 주요 유형이 있습니다.
첫 번째는 C++로 작성된 루트 클래스 로더(부트스트랩 클래스 로더)로, java.lang.Object 및 기타 런타임 코드와 같은 일부 핵심 Java 클래스를 메모리에 로드하는 역할을 합니다. 로딩을 담당하는 패키지: BootStrp------>JRE/lib/rt.jar
두 번째는 확장 클래스 로더(ExtClassLoader)로, Java 클래스에 의해 작성되고 JRE의 일부 클래스를 메모리에 로드하는 역할을 합니다. 로딩을 담당하는 패키지: ExtClassLoader--------->JRE/lib/ext/*.jar
세 번째 유형은 애플리케이션 클래스 로더(AppClassLoader) 또는 CLASSPATH의 클래스를 메모리에 로드하는 시스템 클래스 로더입니다. 애플리케이션 클래스 로더는 ClassLoader.getSystemClassLoader()를 통해 얻을 수 있습니다.
클래스 로더의 상속에 대해 이야기해 보겠습니다. 클래스 로더는 수직 상속의 부모-자식 관계가 아니라 조합 관계입니다. 클래스 로더를 인스턴스화할 때 부모 클래스 로더의 인스턴스를 생성자로 클래스 로더에 전달할 수 있습니다. 매개변수.
클래스 로더에 대한 자세한 내용은 직접 검색해 볼 수 있습니다.
애플리케이션 클래스 로더를 획득한 후에는 리소스 파일을 획득해야 합니다. loader.getResource(path)를 호출하여 해당 경로 아래의 리소스 파일을 로드합니다. 패키지의 리소스는 '/'로 시작할 수 없습니다. 패키지를 일반 폴더로 취급하고 각 패키지를 '/'로 구분합니다.
예: URL url2 = ClassLoader.getSystemClassLoader().getResource("demo/names.ser");는 데모 패키지에서 names.ser 직렬화 파일을 얻는 것입니다.
2. 로드하려면 현재 로드해야 하는 클래스의 getResource 메서드를 사용합니다. 실제로 이 메서드도 이 클래스를 로드하는 클래스 로더를 호출하여 리소스 파일을 가져오지만 가져오는 매개변수가 다릅니다.
(1) 클래스가 있는 패키지의 파일을 가져오려면 상대 경로를 사용하여 패키지의 리소스에 직접 액세스할 수 있습니다. 예: Demo1.class.getResource("names.ser"); Demo1의 클래스 파일이 있는 패키지의 리소스를 얻습니다.
(2) 패키지 외부에서 리소스 파일을 얻으려면 URL url = Demo1.class.getResource("/demo/names.ser")와 같이 '/'로 시작해야 합니다. 데모 패키지
실제로 두 번째 방법은 첫 번째 방법을 캡슐화한 것이며 둘 다 ClassLoader를 사용하여 리소스 파일을 로드합니다. 왜 그런 말을 합니까? Class 클래스의 소스 코드를 보면 다음을 알 수 있습니다.