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

111

我有以下的文件目录结构:

  • src
    • main
      • java
      • resources
        • sql (数据库脚本)
        • spring (配置)
      • webapp

在Servlet上下文监听器类中,我想访问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")(最好使用Spring框架),或者应该如何使用servletContext指向resources/sql


根据情况,有三种解决方案的变体:https://dev59.com/DmQm5IYBdhLWcg3wxBVg#56327069 - Gangnus
4个回答

86

我假设在构建时将src/main/resources/文件夹中的内容复制到了WEB-INF/classes/文件夹中。如果是这种情况,你只需要执行以下操作(用实际的类名和路径替换)。

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

谢谢!这对我有用,使用那个URL,然后构建新文件的路径,最后获取该目录中的文件。 - yamilmedina
2
你不需要文件。你已经有一个URL了。你甚至不能假设有任何文件或目录。WAR文件可能还没有被解压缩。 - user207421
这里的MyServletContextListener是什么意思? - Tejesh Raut
@TejeshRaut 是一个占位符,用于实现 javax.servlet.ServletContextListener 接口的类。我使用它作为示例,因为问题中有来自 contextInitialized 的代码片段,这是由 ServletContextListener 接口定义的方法。 - Dev
对我来说,在路径前加上 classpath: 是至关重要的,因此应该这样写:"classpath:/sql/script.sql" - isgoed

76

最后,这就是我所做的:

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

12
您确定要使用"/sql"作为参数吗?因为起始斜杠可能会引起问题,改用"sql"试试。 - Abdull
2
请注意,使用this.getClass().getResource("/sql"))可能会得到不同的URL。 - ShadowGames
这不适用于所有容器。比如说,Tomcat。 - user207421

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

...

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

值得注意的是,这将限制您的部署选项,ClassPathResource.getFile() 只有在容器已经解压了您的war文件时才会起作用。


11

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

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

然后你可以使用方法如下:.getContent(),.getFile(),.getPath()等


3
他们是否还支持在执行jar文件时获取资源? - Displee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接