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

Posted

技术标签:

【中文标题】如何以编程方式获取资源目录路径【英文标题】: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

【问题讨论】:

解决方案有三种变体,视情况而定:***.com/a/56327069/715269 【参考方案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 文件执行代码时获取资源?

以上是关于如何以编程方式获取资源目录路径的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式获取 apk 文件名和路径?

如何在wildfly服务器中以编程方式热重载静态资源(如xhtml)以获取爆炸战争中存在的库

如何以编程方式派生Windows下载文件夹“%USERPROFILE%/ Downloads”?

以编程方式将资源加载为字节数组

以编程方式获取 powershell.exe 的完整路径

如何以编程方式从 sdcard/storage .apk 文件中获取 appicon?