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.