Kaynak dizini yolunu programlı olarak alma


90

Aşağıdaki dizin düzenine sahibim:

  • src
    • ana
      • java
      • kaynaklar
        • sql (veritabanı betikleri)
        • yay (konfigürasyon)
      • internet uygulaması

ServletContextListener sınıfında, SQL dizini altındaki dosyalara erişmek ve onları listelemek istiyorum. Temelde benim sorunum yolla ilgili, çünkü dosyaları bir dizin altında listelemenin kısaca şöyle olduğunu biliyorum:

File folder = new File(path);
File[] listOfFiles = folder.listFiles();

Belki ServletContextEventnesneyi kullanarak bir yol inşa edebilirim.resources/sql

public void contextInitialized(ServletContextEvent event) {
    event.getServletContext(); //(getRealPath etc.)
}

Bu yolu göreceli, kodlanmamış bir şekilde ayarlamak için bir şey var mı? new File("classpath:sql")(Mümkünse tercihen yay) gibi bir şey veya servletContext'i işaret etmek için ne yapmalıyım resources/sql?


Duruma bağlı olarak üç çözüm çeşidi vardır: stackoverflow.com/a/56327069/715269
Gangnus

Yanıtlar:


70

Derleme zamanında .war dosyanızın içeriğinin src/main/resources/kopyalandığını varsayıyorum WEB-INF/classes/. Eğer durum buysa, sadece yapabilirsiniz (sınıf adı ve yüklenen yol için gerçek değerleri ikame ederek).

URL sqlScriptUrl = MyServletContextListener.class
                       .getClassLoader().getResource("sql/script.sql");

Teşekkürler!! bu benim için çalıştı, bu URL ile daha sonra yeni Dosya için Yol oluşturdum ve sonunda bu dizindeki dosyaları alıyorum.
yamilmedina

2
Dosyaya ihtiyacınız yok. Zaten bir URL'niz var. Bir dosya veya dizin olduğunu bile varsayamazsınız. SAVAŞ ambalajı açılmamış olabilir.
user207421

MyServletContextListener burada ne anlama geliyor?
Tejesh Raut

@TejeshRaut Uygulayan bir sınıf için yer tutucudur javax.servlet.ServletContextListener. Bunu bir örnek olarak kullandım çünkü soru arayüz contextInitialized tarafından tanımlanan bir yöntem olan bir pasaja sahipti ServletContextListener.
Dev

63

Sonunda yaptığım şey buydu:

private File getFileFromURL() {
    URL url = this.getClass().getClassLoader().getResource("/sql");
    File file = null;
    try {
        file = new File(url.toURI());
    } catch (URISyntaxException e) {
        file = new File(url.getPath());
    } finally {
        return file;
    }
}

...

File folder = getFileFromURL();
File[] listOfFiles = folder.listFiles();

11
"/sql"Parametre olarak kullanmaktan emin misiniz ? Bir başlangıç ​​eğik çizgi ile sorunlarım var, Bunun yerine "sql"çalışıyor.
Abdull

2
This.getClass (). GetResource ("/ sql")) ile farklı bir URL alabileceğinizi lütfen unutmayın;
ShadowGames

Bu, tüm kapsayıcılarda çalışmaz. Örneğin Tomcat.
user207421

16
import org.springframework.core.io.ClassPathResource;

...

File folder = new ClassPathResource("sql").getFile();
File[] listOfFiles = folder.listFiles();

Bunun dağıtım seçeneklerinizi sınırlayacağına dikkat etmek önemlidir, ClassPathResource.getFile()yalnızca konteyner savaş dosyanızı patlattıysa (fermuarını açtıysa) işe yarar.


7

Com.google.common.io.Resources sınıfını kullanmanız yeterlidir . Misal:

 URL url = Resources.getResource("file name")

Bundan sonra şu yöntemlere sahipsiniz : .getContent (), .getFile (), .getPath () vb.


1
Kod bir jar dosyasından yürütülürken kaynak almayı da destekliyorlar mı?
Displee
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.