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

why*_*yem 70 java io spring

我有以下目录布局:

  • SRC
    • 主要
      • java的
      • 资源
        • sql(数据库脚本)
        • 弹簧(配置)
      • Web应用程序

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

File folder = new File(path);
File[] listOfFiles = folder.listFiles();
Run Code Online (Sandbox Code Playgroud)

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

public void contextInitialized(ServletContextEvent event) {
    event.getServletContext(); //(getRealPath etc.)
}
Run Code Online (Sandbox Code Playgroud)

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

Dev*_*Dev 59

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

URL sqlScriptUrl = MyServletContextListener.class
                       .getClassLoader().getResource("sql/script.sql");
Run Code Online (Sandbox Code Playgroud)

  • 您不需要文件.你已经有了一个URL.你根本不能假设有一个文件或目录.WAR可能尚未解压缩. (2认同)

why*_*yem 51

最后这就是我所做的.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

...

File folder = getFileFromURL();
File[] listOfFiles = folder.listFiles();
Run Code Online (Sandbox Code Playgroud)

  • 你确定使用``/ sql``作为参数吗?我有一个起始斜杠的问题,而不是``sql"`工作. (8认同)
  • 请注意,您可以使用this.getClass()。getResource(“ / sql”));获得另一个URL。 (2认同)

sam*_*wis 15

import org.springframework.core.io.ClassPathResource;

...

File folder = new ClassPathResource("sql").getFile();
File[] listOfFiles = folder.listFiles();
Run Code Online (Sandbox Code Playgroud)

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


gre*_*rep 8

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

 URL url = Resources.getResource("file name")
Run Code Online (Sandbox Code Playgroud)

之后你有像这样的方法:.getContent(), .getFile(), .getPath() 等

  • 他们是否还支持在从 jar 文件执行代码时获取资源? (2认同)