SORU
24 Mart 2009, Salı


Bir İnputStream gibi bir dosya yükleme farklı şekillerde

Arasındaki fark nedir:

InputStream is = this.getClass().getClassLoader().getResourceAsStream(fileName)

ve

InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName)

ve

InputStream is = this.getClass().getResourceAsStream(fileName)

Ne zaman biri diğerlerinden daha kullanmak daha uygundur?

Okumak istiyorum o dosyayı okuyan benim sınıf gibi bir sınıf. Benim sınıf ve dosya aynı kavanozda ve KULAK bir dosya olarak paketlenmiş ve Değişen 6.1 konuşlanmış.

CEVAP
24 Mart 2009, Salı


Geçirmeden fileName nasıl yorumlanacağını olarak küçük farklar vardır. Temelde 2 farklı yöntem vardır: ClassLoader.getResourceAsStream() Class.getResourceAsStream(). Bu iki yöntem farklı kaynak bulun.

Class.getResourceAsStream(path), yolu bir yolu çağırmak sınıf paketi yerel olarak yorumlanır. Aşağıdaki konumda örneği, String.getResourceAsStream("myfile.txt") sınıf içinde bir dosya arayacaktır çağırmak için: "java/lang/myfile.txt". Eğer yolunuz ** 12, sonra başlarsa mutlak bir yol olarak kabul edilecektir, ve sınıf kök aramaya başlayın. Yani String.getResourceAsStream("/myfile.txt") arama sınıf yolunuzda şu konuma bakar ./myfile.txt.

ClassLoader.getResourceAsStream(path) tüm yollar mutlak yollar bulacaktır. Bu yüzden String.getClassLoader().getResourceAsString("myfile.txt") String.getClassLoader().getResourceAsString("/myfile.txt") hem şu konumda senin sınıf bir dosya için arama: ./myfile.txt.

Her söz bir yerde bu yazı, olabilir bir yerde dosya sistemi kendisi veya içindeki ilgili jar dosyası bağlı olarak Sınıf ve/veya ClassLoader sen yükleme kaynaktan.

Senin durumunda, Uygulama sunucusundan sınıfı yükleniyor, this.getClass().getClassLoader().getResourceAsStream(fileName) yerine Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName) kullanmaniz gerekir. this.getClass().getResourceAsStream() da çalışacak.

Bu sorun hakkında daha ayrıntılı bilgi için this article okuyun.


Aşağıda Tomcat 7 kullanıcıları için Uyarı

Bu sorunun cevabı bir açıklamam Tomcat 7 yanlış gibi görünüyor belirtiyor. Bu durumda olurdu neden görmek için etrafına bakmaya çalıştım.

Tomcat kodu WebAppClassLoader Tomcat çeşitli sürümleri için kaynak baktım. findResource(String name) uygulanması utimately istenen kaynağa URL üretmek için sorumlu olan) Tomcat 6 ve 7 hemen hemen aynıdır, ama Tomcat 8 farklı Tomcat.

Ve 7, Uygulama kaynak adı normalize etmek denemez sürümleri 6. Bu sürüm, classLoader.getResourceAsStream("/resource.txt") ki classLoader.getResourceAsStream("resource.txt") olay Javadoc belirtir ne zamandan beri () aynı sonucu vermeyebilir anlamına gelir. [source code]

Sürüm 8 olsa da, kaynak adı, kaynak adı mutlak sürüm olduğunu garanti normalleşir. Bu nedenle, Tomcat 8, iki arama yukarıda açıklanan her zaman aynı sonucu döndürür. [source code]

Sonuç olarak, Tomcat sürümleri 8'den önceki on ClassLoader.getResourceAsStream() Class.getResourceAsStream() kullanırken ekstra dikkatli olmak zorunda. Ve aynı zamanda class.getResourceAsStream("/resource.txt") aslında classLoader.getResourceAsStream("resource.txt") (/ lider çıkartılır) çağıran akılda tutmak gerekir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chilla Frilla™

    Chilla Frill

    7 Aralık 2006
  • Evan Coury

    Evan Coury

    29 NİSAN 2007
  • theavettbrothers

    theavettbrot

    9 ŞUBAT 2007