fileNameGeç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").