java.io.File
Ve eşleri yerel disk dosya sistemine etki eder. Sorununuzun temel nedeni, göreli yolların java.io
geçerli çalışma dizinine bağlı olmasıdır. Yani JVM'nin (sizin durumunuzda: web sunucusunun biri) başlatıldığı dizin. Bu, örneğin olabilir C:\Tomcat\bin
veya tamamen farklı, ama böylece bir şey değil C:\Tomcat\webapps\contextname
ya da ne olmasını beklersiniz. Normal bir Eclipse projesinde bu olurdu C:\Eclipse\workspace\projectname
. Geçerli çalışma dizini hakkında şu şekilde bilgi edinebilirsiniz:
System.out.println(new File(".").getAbsolutePath());
Ancak, çalışma dizini hiçbir şekilde program aracılığıyla denetlenemez. Gerçekten göreli yollar yerine API'da mutlak yollar kullanmayı tercih etmelisiniz File
. ÖrneğinC:\full\path\to\file.ext
.
Java (web) uygulamalarında sabit kod yazmak veya mutlak yolu tahmin etmek istemezsiniz. Bu sadece taşınabilirlik sorunudur (yani X sisteminde çalışır, ancak Y sisteminde çalışmaz). Normal uygulama, bu tür kaynakları sınıfyoluna yerleştirmek veya sınıf yoluna tam yolunu eklemektir ( src
sırasıyla klasör ve "oluşturma yolu" olan Eclipse gibi bir IDE'ye ). Eğer yardımıyla onları yakala Bu şekilde ClassLoader
tarafından ClassLoader#getResource()
veya ClassLoader#getResourceAsStream()
. Tesadüfen tesadüf olarak dosyaları sınıf yolunun "kökü" ne göre bulabilir. Web uygulamalarında (veya birden fazla sınıf yükleyici kullanan başka bir uygulamada) ClassLoader
tarafından döndürülen şekilde kullanılması önerilir.Thread.currentThread().getContextClassLoader()
için böylece webapp bağlamının "dışına" da bakabilirsiniz.
Webapps'teki diğer bir alternatif ServletContext#getResource()
ve onun karşılığıdır ServletContext#getResourceAsStream()
. web
Klasör de dahil olmak üzere webapp projesinin ortak klasöründe bulunan dosyalara erişebilir /WEB-INF
. ServletContext
Miras yoluyla servlet mevcutturgetServletContext()
yöntemle, bunun gibi kullanıldı çağırabilir.
Ayrıca bakınız: