102

我有以下目录布局:

  • 源代码
    • 主要的
      • 爪哇
      • 资源
        • sql(数据库脚本)
        • 弹簧(配置)
      • 网络应用

在 ServletContextListener 类中,我想访问 SQL 目录下的文件并列出它们。基本上我的问题在于路径,因为我知道简而言之,列出目录下的文件是:

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

也许我可以使用ServletContextEventObject 来尝试构建一条路径resources/sql

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

是否存在以相对、非硬编码的方式设置该路径的东西?类似的东西new File("classpath:sql")(如果可能的话最好是春天)或者我应该用 servletContext 做什么来指向resources/sql

4

4 回答 4

77

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

URL sqlScriptUrl = MyServletContextListener.class
                       .getClassLoader().getResource("sql/script.sql");
于 2013-10-17T01:20:08.183 回答
69

最后,这就是我所做的:

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();
于 2013-10-18T21:16:12.210 回答
17
import org.springframework.core.io.ClassPathResource;

...

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

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

于 2013-10-16T22:20:36.360 回答
10

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

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

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

于 2019-02-11T22:43:32.797 回答