【问题标题】:How to get resources directory path programmatically如何以编程方式获取资源目录路径
【发布时间】:2013-10-25 05:15:18
【问题描述】:

我有以下目录布局:

    • 主要
      • java
      • 资源
        • sql(数据库脚本)
        • 弹簧(配置)
      • 网络应用

在 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") 之类的东西(如果可能的话最好是 spring)或者我应该用 servletContext 做什么来指向resources/sql

【问题讨论】:

标签: java spring io


【解决方案1】:
import org.springframework.core.io.ClassPathResource;

...

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢!!这对我有用,使用该 URL 然后我为新文件构建路径,最后获取该目录中的文件。
    • 您不需要该文件。您已经有一个 URL。你甚至不能假设有一个文件或一个目录。 WAR 可能尚未解压缩。
    • 这里的 MyServletContextListener 是什么意思?
    • @TejeshRaut 它是实现javax.servlet.ServletContextListener 的类的占位符。我用它作为例子是因为问题有一个来自contextInitialized 的sn-p,这是ServletContextListener 接口定义的方法。
    • 对我来说,在路径前加上classpath: 至关重要,所以:"classpath:/sql/script.sql"
    【解决方案3】:

    最后,这就是我所做的:

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

    【讨论】:

    • 您确定使用"/sql"作为参数吗?我的斜线有问题,取而代之的是 "sql" 工作。
    • 请注意,您可以使用 this.getClass().getResource("/sql")); 获取不同的 URL;
    • 这不适用于所有容器。以 Tomcat 为例。
    【解决方案4】:

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

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

    之后,您可以使用以下方法:.getContent()、.getFile()、.getPath() 等

    【讨论】:

    • 它们是否也支持在从 jar 文件执行代码时获取资源?
    猜你喜欢
    • 2019-03-12
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    相关资源
    最近更新 更多