SpringBoot 实战:加载和读取资源文件内容
The following article is from 看山的小屋 Author 看山灬
本文聊一聊在 SpringBoot 应用中,访问加载类路径(classpath)中的文件内容的多种方法。
通过Resource
接口
Resource
接口抽象出一种更底层的方式管理资源,可以实现通过统一的方式处理各类文件资源。下面是几种获取资源实例的方法。
手动加载
访问类路径中的文件,我们可以直接使用ClassPathResource
加载内容,比如:
new ClassPathResource("data/resource-data.txt");
默认情况下,ClassPathResource
会在线程的上下文类加载器和默认系统类加载器之间进行选择,以删除样板文件。我们也可以直接指定类加载器,比如:
new ClassPathResource("data/resource-data.txt", this.getClass().getClassLoader());
或者是通过指定类的类加载器:
new ClassPathResource("data/resource-data.txt", Employee.class.getClassLoader());
从Resource
对象,我们可以很容易的将其转换为InputStream
或File
对象。
上面说的方式都是相对于类路径的地址。如果想要指定某个类的相对路径,我们可以通过指定具体类来定义,比如:
new ClassPathResource("../../../data/resource-data.txt", Example.class).getFile();
这样就是相对于Example
的相对路径了。在实际使用中,不太建议通过类获取其相对路径的文件。这样会将类与文件的相对坐标绑定,如果修改了类的包路径,但是忘记修改文件位置,就会出现错误。而且,大家现在一般是使用 Maven 之类的包管理器管理,可以直接在resources
目录中定义配置文件,使用类路径的相对地址加载文件即可。
通过@Value
自动转换
我们还可以使用@Value
直接注入Resource
对象,比如:
@Value("classpath:data/resource-data.txt")
Resource resourceFile;
@Value
还能支持其他的加载协议,比如file:
或url:
。
通过ResourceLoader
加载
我们还能使用注入ResourceLoader
来实现资源的懒加载,比如,先注入ResourceLoader
实例:
@Autowired
ResourceLoader resourceLoader;
然后在我们需要的地方,通过ResourceLoader
实例加载资源:
resourceLoader.getResource("classpath:data/resource-data.txt");
在 Spring 中,ApplicationContext
实现了ResourceLoader
,所以,我们也可以直接通过ApplicationContext
实例加载资源,比如:
ApplicationContext context;
public Resource loadEmployeesWithApplicationContext() {
return context.getResource("classpath:data/resource-data.txt");
}
使用ResourceUtils
加载资源
在 Spring 内部,还提供了一个工具类ResourceUtils
,可以很方便的获取类路径中额资源。但是通过这个类的 Javadoc 可以看到,这个类主要是在 Spring 内部使用,也就是说,不太推荐这种用法。不过我们可以了解一下:
public File loadEmployeesWithSpringInternalClass()
throws FileNotFoundException {
return ResourceUtils.getFile(
"classpath:data/resource-data.txt");
}
我们可以了解其内部实现,但是还是建议使用其他更加标准的做法。
读取资源中的内容
上面都是通过各种方式获取了Resource
资源,接下来我们就聊聊如果获取资源对象的数据。
比如,我们的资源文件内容如下:
站点:https://www.howardliu.cn
作者:看山
公号:看山的小屋 (kanshanshuo)
关注公号得福利:不知道多少 G 的资料(电子书、视频等等)
通过File
对象读取
我们可以使用getFile
方法得到File
实例,就可以用读取File
对象的方式读取文件了,比如:
@Test
File resource = new ClassPathResource("data/resource-data.txt").getFile();
String content = new String(Files.readAllBytes(resource.toPath()));
但是这种方式不适用于读取 jar 包中的文件,鉴于现在很多应用都是通过 FatJar 方式部署,我们还需要找找其他方式。
通过InputStream
对象读取
File
对象不适合 jar 包中资源读取的原因在于文件路径格式不一样,所以我们可以直接将资源内容读取为流的形式,这样就没有文件路径的问题了。比如:
InputStream resource = new ClassPathResource("data/resource-data.txt").getInputStream();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(resource))) {
String content = reader.lines().collect(Collectors.joining("\n"));
}
读取完毕。
RECOMMEND
推荐阅读
Spring Boot学习指南:构建云原生Java和Kotlin应用程序
Spring Boot每月的下载量超过7500万,是目前使用最广泛的Java框架。它的易用性和强大功能彻底改变了应用程序的开发方式,使应用程序逐渐从单体形式发展到微服务。然而,Spring Boot的简单性也可能令人困惑。开发人员如何学习足够的知识来立即提高生产效率呢?本书展示了如何使用该框架来编写成功的任务关键型应用程序。
本书语言简练,既适合刚接触Spring Boot的新手学习基础知识,也适合有经验的开发者找到关键功能,以便将这些功能应用到实际应用中。
Spring Boot技术内幕:架构设计与实现原理
这是一本从源码角度分析Spring Boot底层原理和实现方式,以求帮助读者掌握Spring Boot多场景联合运用、项目性能调优的实践指导书。作者是Spring Boot领域的布道者、技术专家朱智胜,曾以视频、文章等形式分享自己多年实践及研究Spring Boot的经验,影响近50万该领域的读者。
扫码关注【华章计算机】视频号
每天来听华章哥讲书
更多精彩回顾
书讯 | 11月书讯(上)| 拿下这些新书,赢在起跑线书讯 | 11月书讯(下) | 拿下这些新书,赢在起跑线
资讯 | 什么是ETL?一文掌握ETL设计过程书单 | 8本书助你零基础转行数据分析岗干货 | 一文读懂逻辑门收藏 | 盘点云原生的5大特征上新 | 【新书速递】产品经理应该知道的72件事赠书 | 【第80期】浅谈如何成为技术一号位?