当前位置: 首页 > news >正文

SpringBoot 实战:加载和读取资源文件内容

f1455f1f2a7153f139f156c4b420874c.gif

本文聊一聊在 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对象,我们可以很容易的将其转换为InputStreamFile对象。

上面说的方式都是相对于类路径的地址。如果想要指定某个类的相对路径,我们可以通过指定具体类来定义,比如:

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

推荐阅读

3b5056fef4109fccb64f8f813a53cd77.png

01

推荐阅读

Spring Boot学习指南:构建云原生Java和Kotlin应用程序

18f2235121e7a8cfa0fecf36c0842dfd.png

Spring Boot每月的下载量超过7500万,是目前使用最广泛的Java框架。它的易用性和强大功能彻底改变了应用程序的开发方式,使应用程序逐渐从单体形式发展到微服务。然而,Spring Boot的简单性也可能令人困惑。开发人员如何学习足够的知识来立即提高生产效率呢?本书展示了如何使用该框架来编写成功的任务关键型应用程序。

本书语言简练,既适合刚接触Spring Boot的新手学习基础知识,也适合有经验的开发者找到关键功能,以便将这些功能应用到实际应用中。

be5bc9cadfd3f5c55837c3d75ec97bbf.png

02

推荐阅读

Spring Boot技术内幕:架构设计与实现原理

8addb6097ff1a9adabd92056f6ce6607.png

这是一本从源码角度分析Spring Boot底层原理和实现方式,以求帮助读者掌握Spring Boot多场景联合运用、项目性能调优的实践指导书。作者是Spring Boot领域的布道者、技术专家朱智胜,曾以视频、文章等形式分享自己多年实践及研究Spring Boot的经验,影响近50万该领域的读者。


709969102c8e1713ec3b5a4048df3990.gif

848cf27f30437bd1a24f348b860fa6af.png

扫码关注【华章计算机】视频号

每天来听华章哥讲书

c7b2f57b0b288618e4ade3c1f54d739a.gif

更多精彩回顾

书讯 | 11月书讯(上)| 拿下这些新书,赢在起跑线

书讯 | 11月书讯(下) | 拿下这些新书,赢在起跑线

资讯 | 什么是ETL?一文掌握ETL设计过程

书单 | 8本书助你零基础转行数据分析岗

干货 | 一文读懂逻辑门

收藏 | 盘点云原生的5大特征

上新 | 【新书速递】产品经理应该知道的72件事

赠书 | 【第80期】浅谈如何成为技术一号位?

0fd5bf3a70c6455c7b0f9c31a44afd58.gif

58057e1acd1d6f9047ccb33fecb0eec3.gif

点击阅读全文购买

相关文章:

  • 终于有人把云计算与数据库的关系讲明白了
  • 为什么 Rust 是编程的未来?
  • 四种代码洁癖类型,程序员看了直呼内行
  • JavaScript成最受欢迎的编程语言,社区规模近 1650 万
  • 微软不会放弃Electron:Electron 快速入门及IPC 通信
  • 什么是边缘计算?它是怎样火起来的?终于有人讲明白了
  • 进阶必看的 RocketMQ ,就这篇了
  • 深度解析用户画像标签体系构建方法
  • 【第81期】4道题测试一下,你适不适合做产品经理
  • 【新书速递】你不知道的LevelDB
  • 手把手教你写一个迷你 Webpack
  • 聊聊“企业架构”这个连很多IT老兵都陌生的词
  • 【新书速递】解决方案架构师修炼之道
  • CPU可以跑多快?地球到火星的距离告诉你!
  • 解析OpenShift的存储规划
  • Angular2开发踩坑系列-生产环境编译
  • Django 博客开发教程 8 - 博客文章详情页
  • Docker: 容器互访的三种方式
  • Iterator 和 for...of 循环
  • LeetCode算法系列_0891_子序列宽度之和
  • magento2项目上线注意事项
  • Puppeteer:浏览器控制器
  • python学习笔记 - ThreadLocal
  • Python语法速览与机器学习开发环境搭建
  • Travix是如何部署应用程序到Kubernetes上的
  • vue-router的history模式发布配置
  • 编写高质量JavaScript代码之并发
  • 大整数乘法-表格法
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 强力优化Rancher k8s中国区的使用体验
  • 软件开发学习的5大技巧,你知道吗?
  • 手写一个CommonJS打包工具(一)
  • 【云吞铺子】性能抖动剖析(二)
  • HanLP分词命名实体提取详解
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #数学建模# 线性规划问题的Matlab求解
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (SpringBoot)第七章:SpringBoot日志文件
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (过滤器)Filter和(监听器)listener
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (转载)深入super,看Python如何解决钻石继承难题
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • ./configure,make,make install的作用
  • .Net 6.0 处理跨域的方式
  • .NET Core 通过 Ef Core 操作 Mysql
  • .Net Remoting(分离服务程序实现) - Part.3
  • .Net6 Api Swagger配置
  • .net6Api后台+uniapp导出Excel
  • .NET设计模式(11):组合模式(Composite Pattern)
  • /etc/skel 目录作用