2013-10-16 31 views
38

我有以下的目錄佈局:如何獲得資源的目錄路徑編程

  • SRC
    • 主要
      • 的Java
      • 資源
        • SQL(數據庫腳本)
        • 彈簧(配置)
      • 的webapp

在一個的ServletContextListener類,我要訪問的SQL目錄列表下的文件他們。基本上我的問題是與路徑,因爲我知道,簡而言之目錄上列出的文件是:

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

也許我可以用ServletContextEvent對象,試圖建立以resources/sql

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

是否存在以相對非硬編碼的方式設置路徑? 像new File("classpath:sql")(最好是彈簧,如果可能的話)或者我應該如何處理servletContext指向resources/sql

回答

28

我假設src/main/resources/的內容在構建時被複制到了.war中的WEB-INF/classes/。如果是這種情況,你可以這樣做(用真實值替換類名和被加載的路徑)。

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

謝謝!這爲我工作,與該URL然後我建立新的文件的路徑,並最終獲得該目錄中的文件。 – whyem

+2

你不需要文件。你已經有了一個URL。你甚至不能假設有一個文件或一個目錄。 WAR可能尚未解壓。 – EJP

+0

MyServletContextListener在這裏表示什麼? –

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

... 

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

值得注意的是,這將限制你的部署選項,ClassPathResource.getFile()只有當容器爆裂(解壓)WAR文件的工作。

34

最後這就是我所做的。

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(); 
+4

你確定使用'「/ sql」'作爲參數嗎?我有一個開始斜線的問題,而不是'「sql」'工程。 – Abdull