2013-04-16 17 views
6

Sadece bir dosyayı programıma okumak istiyorum. Dosya, "../f.fsh" adresindeki çalışma dizininin üstünde bir dizin bulunur. Yani şu kod Ben IDE içinde çalıştırdığınızda düzgün çalışırNeden GetourceAsStream(), IDE'de çalışır, JAR değil?

String name="../f.fsh"; 
InputStream is = getClass().getResourceAsStream(name); 
InputStreamReader isreader=new InputStreamReader(is);//CRASHES HERE WITH NULL POINTER EXCEPTION 
BufferedReader br = new BufferedReader(isreader); 

ama f.fsh bunun içinde sıkıştırılmış ve çalıştırın bir JAR dosyası oluştururken InputStreamReader oluştururken, bu çöküyor InputStream çünkü boş.

Girdi akışları ve JAR dosyaları hakkındaki sorulara bir sürü yanıt okudum ve bundan ne çıkarsam göreceli yollar kullanmam gerektiğiydi, ancak bunu zaten yapıyorum. Anladığım kadarıyla getResourceAsStream(), projenin kökü ile ilgili dosyaları bulabilir, istediğim budur. Neden JAR'da çalışmıyor? Neyin yanlış gidiyor, nasıl düzeltebilirim?

Sınıf yolu ile ilgisi var mı? Sadece çalışmakta olan kavanozun dışındaki dosyaları dahil etmeyi düşündüm.

Ben de denedim, ama bir çizgi koyarak zaman yine başarısız olması: How to get a path to a resource in a Java JAR file andfound bir JAR içeriğini necesarily bir dosya olarak erişilebilir olmayabilir: Ben baktım

InputStream is = getClass().getResourceAsStream("\\"+name); 

. Bu yüzden dosyayı jar ile ilgili olarak kopyalamayı denedim (kavanozdan bir dizin) ve bu hala başarısız oluyor. Her durumda, dosyalarımı kavanozda bırakmak ve orada okuyabilmek istiyorum. Neyin yanlış gittiğini bilmiyorum.

cevap

3

Eclipse'den çalışırken, Class.getResourceAsStream().. çalışıyorsa, Eclipse'deki bir hatadır. Eclipse ve diğer IDE'ler, çalışma zamanında projeden kaynak almak için özel sınıf yükleyicileri kullanır. Eclipse'deki sınıf yükleyici uygulamasının, getResourceAsStream() yöntemine girişte gerekli tüm doğrulamaları yapmadığı anlaşılıyor. Bu durumda, hata sizin lehinize olacaktır, ancak yine de kodunuzun kaynaklarınızı her durumda çalışacak şekilde nasıl yapılandıracağınızı tekrar gözden geçirmeniz gerekecektir.

+0

Teşekkürler, bu mantıklı. Dosya konumlarımı ve kaynaklarımın yerini değiştirdim ve bu hatayı kavanozda geçebildi. Eclipse'in benim lehimde bir böcek olduğunu asla düşünmezdim. Çok teşekkür ederim! – AAB

8

Class.getResourceAsStream() ile ..'u kullanamazsınız.

sınıfın ambalajın bir alt ambalaj foo.bar bir kaynak f.fsh yüklemek için SomeClass.class.getResourceAsStream("f.fsh")

kullanarak, sınıf ile aynı paket içinde, bir kaynak f.fsh yüklemek için SomeClass.class.getResourceAsStream("foo/bar/f.fsh")

kullanmak için herhangi bir paket com.company.foo.bar bir kaynak f.fsh yük bu örnekler yoksun olmasına rağmen, SomeClass.class.getResourceAsStream("/com/company/foo/bar/f.fsh")

Bu getResource() yöntemin javadoc anlatılan kullanımı.

+0

Yanıt için teşekkürler, bir eğik çizgi ekleme veya başlangıçta ne yazdığınızı görüyorum. ".." ile çalışmıyor? Tutulmadan onu çalıştırdığımda ".." i imha ediyor gibi görünüyor. Ama sadece kavanozdan uyumlu değil mi? Neden olduğunu biliyor musun? – AAB

+1

Bir kavanozun dışında kullanıldığında bile şaşırıyorum. Javadoc, kullanılmasına izin vermiyor. Sadece nasıl tasarlandı. –

+0

Sadece aynı sorunu yaşadı. Benim tahminim, diskteki sınıf dosyalarından yürütüldüğünde argümanın bir OS fonksiyonuna basitçe (biraz ayrıştırılmış) gönderilmesi ve bu yüzden de protokolü takip etmese bile çalıştığı olurdu. Bu SE6 btw ile test edildi. – user

İlgili konular