Ada dua metode yang umum digunakan untuk memuat file sumber daya:
1. Gunakan ClassLoader. Pada titik ini, saya harus menyebutkan klasifikasi ClassLoader Ada tiga tipe utama ClassLoader yang dibangun di Java.
Yang pertama adalah pemuat kelas root (pemuat kelas bootstrap), yang ditulis dalam C++, yang bertanggung jawab untuk memuat beberapa kelas utama Java, seperti java.lang.Object dan kode runtime lainnya ke dalam memori. Paket yang bertanggung jawab untuk memuat: BootStrp------>JRE/lib/rt.jar
Yang kedua adalah pemuat kelas yang diperluas (ExtClassLoader), yang ditulis oleh kelas java dan bertanggung jawab untuk memuat beberapa kelas di JRE ke dalam memori. Paket yang bertanggung jawab untuk memuat: ExtClassLoader---------->JRE/lib/ext/*.jar
Tipe ketiga adalah pemuat kelas aplikasi (AppClassLoader), atau pemuat kelas sistem, yang bertanggung jawab untuk memuat kelas di CLASSPATH ke dalam memori. Pemuat kelas aplikasi dapat diperoleh melalui ClassLoader.getSystemClassLoader();
Mari kita bicara tentang pewarisan pemuat kelas. Pemuat kelas bukanlah hubungan induk-anak dari warisan vertikal, tetapi hubungan kombinasi. Saat membuat instance pemuat kelas, instance pemuat kelas induk dapat diteruskan ke pemuat kelas sebagai sebuah konstruksi parameter.
Untuk informasi detail tentang class loader, Anda dapat mencari sendiri.
Setelah mendapatkan pemuat kelas aplikasi, sekarang saatnya untuk mendapatkan file sumber daya. Panggil loader.getResource(path) untuk memuat file sumber daya di bawah jalur yang sesuai. Tidak dapat dimulai dengan '/' perlakukan paket sebagai folder biasa, pisahkan setiap paket dengan '/'.
Misalnya: URL url2 = ClassLoader.getSystemClassLoader().getResource("demo/names.ser"); adalah untuk mendapatkan file serialisasi nama.ser dalam paket demo.
2. Gunakan metode getResource dari kelas saat ini yang perlu dimuat untuk memuat. Faktanya, metode ini juga memanggil pemuat kelas yang memuat kelas ini untuk mendapatkan file sumber daya, tetapi parameter yang diperoleh berbeda.
(1) Jika Anda ingin mendapatkan file dalam paket tempat kelas berada, Anda dapat menggunakan jalur relatif untuk mengakses langsung sumber daya dalam paket; misalnya: Demo1.class.getResource("names.ser"); yang Anda dapatkan adalah sumber daya dalam paket tempat file kelas Demo1 berada.
(2) Untuk mendapatkan file resource di luar paket harus diawali dengan '/', misalnya URL url = Demo1.class.getResource("/demo/names.ser"); paket demo
Faktanya, metode kedua adalah enkapsulasi dari metode pertama, dan keduanya menggunakan ClassLoader untuk memuat file sumber daya. Mengapa Anda mengatakan itu? Jika Anda melihat kode sumber kelas Class, Anda akan mengetahui: