如何以编程方式获取资源目录路径

时间:2013-10-16 21:41:56

标签: java spring io

我有以下目录布局:

  
      
  • SRC   
        

    •   
          
      • java
      •   
      • 资源
          
            
        • sql(数据库脚本)
        •   
        • spring(配置)
        •   
      •   
      • web应用
      •   
    •   
  •   

在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

4 个答案:

答案 0 :(得分:51)

我假设src/main/resources/的内容在构建时被复制到.war内的WEB-INF/classes/。如果是这种情况你可以这样做(用实数值代替类名和正在加载的路径)。

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

答案 1 :(得分:47)

最后,这就是我所做的:

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

答案 2 :(得分:14)

import org.springframework.core.io.ClassPathResource;

...

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

值得注意的是,这会限制您的部署选项,ClassPathResource.getFile()仅在容器爆炸(解压缩)您的war文件时才有效。

答案 3 :(得分:2)

只需使用 com.google.common.io.Resources 类。示例:

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

之后,您将拥有以下方法: .getContent()、. getFile()、. getPath()等