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


86

我有以下目录布局:

  • src
    • 主要
      • 爪哇
      • 资源
        • 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")(如果可能的话最好是spring)之类的东西,或者我应该如何处理ServletContext指向resources/sql


根据情况,有三种解决方案:stackoverflow.com/a/56327069/715269
Gangnus,

Answers:


69

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

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

谢谢!!这对我有用,使用该URL,然后为新文件构建路径,最后在该目录中获取文件。
yamilmedina 2013年

2
您不需要文件。您已经有一个URL。您甚至无法假设根本没有文件或目录。WAR可能尚未打开包装。
洛恩侯爵,

MyServletContextListener在这里是什么意思?
Tejesh Raut 2015年

@TejeshRaut它是实现的类的占位符javax.servlet.ServletContextListener。我以该示例为例,因为问题有一个片段,contextInitialized 该片段是ServletContextListener接口定义的方法。
2015年

59

最后,这是我所做的:

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

11
您确定要使用"/sql"作为参数吗?我在开始斜杠时遇到问题,但"sql"可以使用。
阿卜杜勒

2
请注意,您可以使用this.getClass()。getResource(“ / sql”));获得另一个URL。
ShadowGames

这不适用于所有容器。以Tomcat为例。
罗恩侯爵,

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

...

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

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


6

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

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

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


1
从jar文件执行代码时,它们还支持获取资源吗?
耗散
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.