SpringBoot项目实战之加载和读取资源文件
作者:看山 发布时间:2023-10-07 06:00:41
目录
通过Resource接口
手动加载
通过@Value自动转换
通过ResourceLoader加载
使用ResourceUtils加载资源
读取资源中的内容
通过File对象读取
通过InputStream对象读取
文末总结
本文聊一聊在 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
作者:看山
公号:看山的小屋关注公号得福利
通过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"));
}
读取完毕。
文末总结
本文从加载资源、读取内容两个方法讲解,给出了多种读取方式。
来源:https://blog.csdn.net/liuxinghao/article/details/120930968


猜你喜欢
- 一、前言文稿扫描大家用的都比较频繁、想是各种证件、文件都可以通过扫描文稿功能保存到手机。相比直接拍照,在扫描文稿时,程序会对图像进行一些矫正
- mybatis的映射文件写法多种多样,不同的写法和用法,在实际开发过程中所消耗的开发时间、维护时间有很大差别,今天我就把我认为比较简单的一种
- APP生命周期wpf项目目录中有一个App.xaml.cs文件,该文件中App是一个partical类,与之对应的另一partical部分在
- 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三
- Java有一种特殊线程,守护线程,这种线程优先级特别低,只有在同一程序中的其他线程不执行时才会执行。由于守护线程拥有这些特性,所以,一般用为
- 概要集合概念:像数组一样是java的一个容器;和数组不同的是数组只能存同类型的数据,且长度定义之后就不可变,集合不仅,可以存多种类型的数据,
- 1、redis的几种常见客户端:Jedis:是Redis的Java实现客户端,提供了比较全面的Redis命令的支持;Redisson:实现了
- 最近因为赶项目进度,因此将本来要用原生控件实现的界面,自己做了H5并嵌入webview中。发现点击H5中 input type="
- 今天给大家带来一篇简单易懂的微技巧文章,并没有什么高深的技术点,但重点是在细节,相信可以给不少朋友带来帮助。Dialog和Toast所有人肯
- Java调用Linux系统命令有时候,我们在使用Java做一些操作时,可能性能上并不能达到我们满意的效果,就拿最近工作中的遇到的一个场景来说
- 什么是NIO?线程在处理数据时,如果线程还处于将数据从channel读到buffer的这段时间内,线程可以去做别的事情,等数据都读到buff
- 本文实例为大家分享了Android自定义View实现滑动回弹的具体代码,供大家参考,具体内容如下前言Android 页面滑动的时候的回弹效果
- 个人认为,提供params关键字以实现方法形参个数可变是C#语法的一大优点。在方法形参列表中,数组类型的参数前加params关键字,通常可以
- springboot整合tkmapper1.导入pom依赖1.1 导入springboot的parent依赖<parent> &
- 本文分析了Android编程中出现The connection to adb is down问题的解决方法。分享给大家供大家参考,具体如下:
- C++中一个重要的特性就是指针,指针不仅具有获得地址的能力,还具有操作地址的能力。指针可以用于数组、或作为函数的参数,用来访问内存和对内存的
- 本文实例为大家分享了Unity使用摄像机实现望远镜效果的具体代码,供大家参考,具体内容如下听起来挺酷炫,其实超简单,就是控制摄像机的fiel
- 这篇文章主要介绍了Java线程并发访问代码分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参
- import android.app.ListActivity; import android.database.Cursor; impor
- 简介反射是Java编程语言中的一个特性。它允许执行的Java程序检查或 操作 自身,并操作程序的内部属性。例如,Java类可以获取其所有成员