() getResourceAsStream vs FileİnputStream
Bir Web uygulaması içinde bir dosya yüklemek için çalışıyordum, ve FileInputStream
kullandım FileNotFound
bir istisna oluyordum. Ancak, aynı yolu kullanarak, getResourceAsStream()
yaptığım zaman dosya yüklemek için başardı. İki yöntem arasındaki fark, ve neden diğeri değil ise işe yarıyor mu?
CEVAP
java.io.File
ve cariyeler yerel disk dosya sistemi üzerinde çalışır. Senin sorunun kök nedeni bugörecelijava.io
yol geçerli çalışma dizini bağlıdır. I. e. dizin (senin durumunda: Web sunucusu) başladı. Bunun için örnek C:\Tomcat\bin
ya da bambaşka bir şey olabilir, ama böylecedeğilOlmasını beklediğiniz her neyse C:\Tomcat\webapps\contextname
ya. Normal Eclipse projesi, C:\Eclipse\workspace\projectname
olurdu. Geçerli çalışma dizini hakkında şu şekilde öğrenebilirsiniz:
System.out.println(new File(".").getAbsolutePath());
Ancak, çalışma dizini hiçbir şekilde Program aracılığıyla denetlenebilir. Gerçekten kullanmayı tercih etmelisinizmutlakFile
yol, göreli yollar yerine API. E. g. C:\full\path\to\file.ext
.
Veya (web)Java uygulamalarında mutlak yolunu koda tahmin etmek istemezsin. Sadece taşınabilirlik sorun (yani Sistem X, sistem içinde çalışır Y). Normal bir uygulama olarak o tür kaynaklara yerleştirmektirsınıftam yolu eklemek için , ya da (src
klasör olan Eclipse gibi bir IDE ve "yol yapım" sırasıyla). sınıf Bu şekilde ClassLoader#getResource()
ClassLoader#getResourceAsStream()
ClassLoader
yardımı ile onları yakala. Dosyalar "tesadüfen anladım." sınıf, köküne göre bulmak mümkün değildir Webapplications (veya birden fazla classloaders kullanan başka bir uygulama) Thread.currentThread().getContextClassLoader()
tarafından döndürülen ClassLoader
bunun için kullanılması tavsiye edilir.
Web uygulamasını başka bir alternatif ServletContext#getResource()
ve muadili ServletContext#getResourceAsStream()
. Erişim dosyaları Web projesi, /WEB-INF
klasörü de dahil olmak üzere ** 20 ortak klasör içinde yer alan yapabiliyor. ServletContext
getServletContext()
kalıtsal bir yöntem ile sunucu uygulamalarına mevcuttur, olduğu gibi çağırabilirsiniz.
Nasıl FileİnputStream kullanırken idea...