fileName
Geçtiğiniz şeyin nasıl yorumlandığı konusunda küçük farklılıklar vardır . Temel olarak, 2 farklı yönteminiz vardır: ClassLoader.getResourceAsStream()
ve Class.getResourceAsStream()
. Bu iki yöntem kaynağı farklı şekilde bulur.
İçinde Class.getResourceAsStream(path)
, yol, çağırdığınız sınıfın paketinin yerel yolu olarak yorumlanır. Örnek arama için, String.getResourceAsStream("myfile.txt")
aşağıdaki konumda adresinden sınıf yolunda bir dosya arar: "java/lang/myfile.txt"
. Yolunuz a ile başlıyorsa /
, mutlak bir yol olarak kabul edilir ve sınıf yolunun kökünden aramaya başlar. Yani arama String.getResourceAsStream("/myfile.txt")
, sınıf yolunuzda aşağıdaki konuma bakacaktır ./myfile.txt
.
ClassLoader.getResourceAsStream(path)
tüm yolları mutlak yollar olarak kabul eder. Yani çağıran String.getClassLoader().getResourceAsStream("myfile.txt")
ve String.getClassLoader().getResourceAsStream("/myfile.txt")
irade aşağıdaki konumda adresinden sınıf yolunda bir dosya için hem görünüm: ./myfile.txt
.
Bu yazıda bir konumdan her bahsettiğimde, kaynağı yüklediğiniz Sınıf ve / veya ClassLoader'a bağlı olarak dosya sisteminizin kendisinde veya karşılık gelen jar dosyasının içinde bir konum olabilir.
Sizin durumunuzda, sınıfı bir Uygulama Sunucusundan yüklüyorsunuz, Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName)
bunun yerine bunu kullanmalısınız this.getClass().getClassLoader().getResourceAsStream(fileName)
. this.getClass().getResourceAsStream()
de işe yarayacak.
Söz konusu sorun hakkında daha ayrıntılı bilgi için bu makaleyi okuyun .
Tomcat 7 ve önceki sürüm kullanıcıları için uyarı
Bu sorunun cevaplarından biri Tomcat 7 için açıklamamın yanlış göründüğünü söylüyor. Bunun neden böyle olduğunu görmek için etrafa bakmaya çalıştım.
Tomcat'in WebAppClassLoader
çeşitli versiyonları için Tomcat'in kaynak koduna baktım . Uygulanması findResource(String name)
(istenen kaynağa URL'yi üretmek için utimately sorumludur) Tomcat 6 ve Tomcat 7 neredeyse aynıdır, ancak Tomcat 8 farklıdır.
Sürüm 6 ve 7'de, uygulama kaynak adını normalleştirmeye çalışmaz. Bu, bu sürümlerde, olayla classLoader.getResourceAsStream("/resource.txt")
aynı sonucu vermeyebileceği anlamına gelir classLoader.getResourceAsStream("resource.txt")
(Javadoc'un belirttiği gibi). [kaynak kodu]
Bununla birlikte, sürüm 8'de, kaynak adının mutlak sürümünün kullanılan ad olduğunu garanti etmek için kaynak adı normalleştirilir. Bu nedenle, Tomcat 8'de yukarıda açıklanan iki çağrı daima aynı sonucu döndürmelidir. [kaynak kodu]
Sonuç olarak, 8 yaşından küçük Tomcat sürümlerini kullanırken ClassLoader.getResourceAsStream()
veya kullanırken çok dikkatli Class.getResourceAsStream()
olmanız gerekir. Ayrıca, class.getResourceAsStream("/resource.txt")
gerçekten arama yaptığını da unutmayın classLoader.getResourceAsStream("resource.txt")
(öncü /
soyulmuş).
getClass().getResourceAsStream("/myfile.txt")
farklı davrandığından eminimgetClassLoader().getResourceAsStream("/myfile.txt")
.