Spring Boot 从 resources 目录读取文件
前言
spring boot 项目打包成 jar 部署之后,如果我们需要从 resources 目录读取文件,需要用流的方式读取而不能采取读普通文件的方式。
在开始之前,假设 resource 目录下面有个 config.xml,我们将介绍三种方式读取 resources 目录中的文件,在最后还附带了一种常见的错误用法供大家对照参考。
1. 使用 getResourceAsStream
try (InputStream in = this.getClass().getResourceAsStream("/config.xml")) {
// 这里处理 inputstream
}
这种方式是 java 原生支持的,不需要借助任何第三方库,推荐使用。
2. 使用 spring 的 ClassPathResource
Resource resource = new ClassPathResource("classpath:config.xml");
try (InputStream in = resource.getInputStream()) {
// 这里处理 inputstream
}
3. 使用 spring 的 ResourceLoader
首先注入 resourceLoader,利用 resourceLoader 以流的方式读取 jar 包中的文件。
@Autowired
ResourceLoader resourceLoader;
Resource resource = resourceLoader.getResource("classpath:config.xml");
try (InputStream in = resource.getInputStream()) {
// 这里处理 inputstream
}
其实不管哪种方式,重要是读取 spring boot jar 包中的文件,必须要使用流的方式读取 Jar 包中的文件。 接下来将介绍一个常见的错误用法。
典型的错误用法
以上介绍的都是正确的方式,下面我们介绍一种典型的错误方式供大家参考:
File file = new File(getClass().getResource("/config.xml").toURI());
BufferedReader reader = new BufferedReader(new FileReader(file));
这种方式企图以普通文件的方式读取 resources 目录下的文件,这里面的坑很深,因为在开发过程中,这种方式可以工作,但是一旦打成 Jar 包部署的时候,就会报错:
Caused by: java.lang.IllegalArgumentException: URI is not hierarchical
at java.io.File.<init>(File.java:420) ~[na:1.8.0_352]
本文介绍了 spring boot 从 resource 目录读取文件的几种常用方式和一种典型的错误方式,希望对大家有用。
有问题吗?点此反馈!
温馨提示:反馈需要登录