我有以下目录布局:
- SRC
- 主
- java
- 资源
- sql(数据库脚本)
- spring(配置)
- web应用
在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")
之类的东西(如果可能的话,最好是弹簧)或者我应该怎么处理servletContext指向resources/sql
?
答案 0 :(得分:51)
我假设src/main/resources/
的内容在构建时被复制到.war内的WEB-INF/classes/
。如果是这种情况你可以这样做(用实数值代替类名和正在加载的路径)。
URL sqlScriptUrl = MyServletContextListener.class
.getClassLoader().getResource("sql/script.sql");
答案 1 :(得分:47)
最后,这就是我所做的:
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();
答案 2 :(得分:14)
import org.springframework.core.io.ClassPathResource;
...
File folder = new ClassPathResource("sql").getFile();
File[] listOfFiles = folder.listFiles();
值得注意的是,这会限制您的部署选项,ClassPathResource.getFile()
仅在容器爆炸(解压缩)您的war文件时才有效。
答案 3 :(得分:2)
只需使用 com.google.common.io.Resources 类。示例:
URL url = Resources.getResource("file name")
之后,您将拥有以下方法: .getContent()、. getFile()、. getPath()等