Rumah >Java >javaTutorial >Bagaimanakah `ClassLoader.getResourceAsStream()` dan `Class.getResourceAsStream()` Berbeza Apabila Memuatkan Fail sebagai InputStreams?

Bagaimanakah `ClassLoader.getResourceAsStream()` dan `Class.getResourceAsStream()` Berbeza Apabila Memuatkan Fail sebagai InputStreams?

Linda Hamilton
Linda Hamiltonasal
2024-12-23 17:21:15692semak imbas

How Do `ClassLoader.getResourceAsStream()` and `Class.getResourceAsStream()` Differ When Loading Files as InputStreams?

cara yang berbeza untuk memuatkan fail sebagai InputStream

Terdapat perbezaan halus dalam tafsiran nama fail yang diluluskan. Pada asasnya terdapat dua kaedah berbeza: ClassLoader.getResourceAsStream() dan Class.getResourceAsStream(). Kedua-dua kaedah ini mencari sumber dalam cara yang berbeza.

Dalam Class.getResourceAsStream(path), laluan itu ditafsirkan sebagai laluan dalam pakej kelas yang anda gunakan untuk memanggilnya. Contohnya, memanggil String.class.getResourceAsStream("myfile.txt") akan mencari fail dalam classpath anda di lokasi berikut: "java/lang/myfile.txt". Jika laluan anda bermula dengan /, ia akan dianggap sebagai laluan mutlak dan carian akan bermula dari punca classpath. Jadi apabila anda memanggil String.class.getResourceAsStream("/myfile.txt"), ia melihat lokasi berikut dalam classpath: ./myfile.txt.

ClassLoader.getResourceAsStream(path) menganggap semua laluan sebagai Laluan mutlak. Jadi, jika anda memanggil String.class.getClassLoader().getResourceAsStream("myfile.txt") dan String.class.getClassLoader().getResourceAsStream("/myfile.txt"), dalam kedua-dua kes ia akan berada dalam classpath di lokasi berikut mencari fail: ./myfile.txt.

Setiap kali saya menyebut lokasi dalam siaran ini, ia mungkin satu Lokasi dalam sistem fail itu sendiri atau dalam fail JAR yang sepadan, bergantung pada kelas dan/atau ClassLoader dari mana anda memuatkan sumber.

Dalam kes anda, anda memuatkan kelas daripada pelayan aplikasi, jadi anda harus Gunakan Thread.currentThread().getContextClassLoader().getResourceAsStream(nama fail) dan bukannya this.getClass().getClassLoader().getResourceAsStream(nama fail). this.getClass().getResourceAsStream() juga berfungsi.

Baca artikel ini untuk mendapatkan maklumat lanjut tentang isu khusus ini.

Nota untuk pengguna Tomcat 7 dan ke bawah

Salah satu jawapan kepada soalan ini menyatakan bahawa penjelasan saya untuk Tomcat 7 nampaknya tidak betul. Saya cuba mencari tahu mengapa ini berlaku.

Jadi saya melihat kod sumber Tomcat's WebAppClassLoader untuk versi Tomcat yang berbeza. Pelaksanaan findResource(String name) (yang akhirnya bertanggungjawab ke atas URL kepada sumber yang diminta) hampir sama dalam Tomcat 6 dan Tomcat 7, tetapi berbeza dalam Tomcat 8.

Dalam versi 6 dan 7, pelaksanaan tidak cuba menormalkan nama sumber. Ini bermakna bahawa dalam versi ini classLoader.getResourceAsStream("/resource.txt") mungkin tidak memberikan hasil yang sama seperti classLoader.getResourceAsStream("resource.txt"), walaupun ia sepatutnya (seperti yang dinyatakan dalam Javadoc). [Kod sumber]

Walau bagaimanapun, dalam versi 8, nama sumber dinormalisasi untuk memastikan versi mutlak nama sumber digunakan. Oleh itu, kedua-dua panggilan yang diterangkan di atas hendaklah sentiasa menghasilkan hasil yang sama dalam Tomcat 8. [Kod sumber]

Oleh itu, anda perlu lebih berhati-hati apabila menggunakan ClassLoader.getResourceAsStream() atau Class.getResourceAsStream() pada versi Tomcat sebelum 8. Dan anda juga perlu ingat bahawa class.getResourceAsStream("/resource.txt") sebenarnya memanggil classLoader.getResourceAsStream("resource.txt") (yang terkemuka / dialih keluar).

Atas ialah kandungan terperinci Bagaimanakah `ClassLoader.getResourceAsStream()` dan `Class.getResourceAsStream()` Berbeza Apabila Memuatkan Fail sebagai InputStreams?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn