SpringBoot项目实战之加载和读取资源文件

目录
  • 通过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"));
}

读取完毕。

文末总结

本文从加载资源、读取内容两个方法讲解,给出了多种读取方式。

到此这篇关于SpringBoot项目实战之加载和读取资源文件的文章就介绍到这了,更多相关SpringBoot加载和读取资源文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot如何实现分离资源文件并打包

    Spring Boot项目默认的会打包成单一的jar文件,但是有时候我们并不想让配置文件.依赖包都跟可执行文件打包到一起.这时候可以在pom.xml文件中进行配置,从而使资源文件.依赖包和可执行文件分离. 这样子更新代码的时候 我们的jar包很少改变 有利于维护 pom.xml 如下 <build> <plugins> <plugin> <!--打包时去除第三方依赖--> <groupId>org.springframework.boot<

  • springboot操作静态资源文件的方法

    默认静态资源供 SpringBoot有几个默认的静态资源目录,当然也可配置,默认配置的/**映射到/static(或/public ,/resources,/META-INF/resources),自定义配置方式如下: spring.mvc.static-path-pattern=/** # Path pattern used for static resources. 前端如果需要访问默认的静态资源,下面有点要注意,考虑下面的目录结构: └─resources │ application.ym

  • springboot如何获取相对路径文件夹下静态资源的方法

    今日遇到一个问题:springboot需要获取到一个自定义名称文件夹下的静态资源(图片等),并且文件夹的路径不在classPath下面,而是一个相对路径. 一开始使用修改配置文件的方式: # 配置静态资源访问前缀 spring.mvc.static-path-pattern=*/** # 配置静态资源路径,默认配置失效 spring.resources.static-locations=../upload 发现并不行,无法解析出相对路径. 后面通过自定义静态资源映射配置类实现了: @Config

  • SpringBoot项目实战之加载和读取资源文件

    目录 通过Resource接口 手动加载 通过@Value自动转换 通过ResourceLoader加载 使用ResourceUtils加载资源 读取资源中的内容 通过File对象读取 通过InputStream对象读取 文末总结 本文聊一聊在 SpringBoot 应用中,访问加载类路径(classpath)中的文件内容的多种方法. 通过Resource接口 Resource接口抽象出一种更底层的方式管理资源,可以实现通过统一的方式处理各类文件资源.下面是几种获取资源实例的方法. 手动加载 访

  • JS实现加载和读取XML文件的方法详解

    本文实例讲述了JS实现加载和读取XML文件的方法.分享给大家供大家参考,具体如下: 有时在开发时用到 JS 加载和读取XML文件的情况,写下提供参考,这里主要是分两步完成: 1. JS加载XML文件 步骤一般为(1),建立 XML DOM 对象:(2),设置加载方式,异步(推荐)或同步: (3)提供XML文件URL然后调用 load 方法:大致如下: var xmlFileName="xxFile.xml"; var xmlDoc=''; if (window.ActiveXObjec

  • springboot启动时是如何加载配置文件application.yml文件

    今天启动springboot时,明明在resources目录下面配置了application.yml的文件,但是却读不出来,无奈看了下源码,总结一下springboot查找配置文件路径的过程,能力有限,欢迎各位大牛指导!!! spring加载配置文件是通过listener监视器实现的,在springboot启动时: 在容器启动完成后会广播一个SpringApplicationEvent事件,而SpringApplicationEvent事件是继承自ApplicationEvent时间的,代码如下

  • 详解springboot启动时是如何加载配置文件application.yml文件

    今天启动springboot时,明明在resources目录下面配置了application.yml的文件,但是却读不出来,无奈看了下源码,总结一下springboot查找配置文件路径的过程,能力有限,欢迎各位大牛指导!!! spring加载配置文件是通过listener监视器实现的,在springboot启动时: 在容器启动完成后会广播一个SpringApplicationEvent事件,而SpringApplicationEvent事件是继承自ApplicationEvent时间的,代码如下

  • Centos8.3、docker部署springboot项目实战案例分析

    引言 目前k8s很是火热,我也特意买了本书去学习了一下,但是k8s动辄都是成百上千的服务器运维,对只有几台服务器的应用来说使用k8s就有点像大炮打蚊子.只有几台服务器的应用运维使用传统的tomcat部署很繁琐,效率不高,动辄十几分钟部署一台服务,使用jenkins部署又太过复杂,斟酌许久我还是选择了使用docker+dockerFile的方式部署.这种方式部署简单高效. docker安装 curl -fsSL https://get.docker.com | bash -s docker --m

  • vue 项目 iOS WKWebView 加载

    1.首先让前端的同事打一个包(index.html,static文件包含css.资源文件.js等)导入项目: :warning: 注意: 把index.html放入项目根目录下,command+n创建一个资源文件.bundle,资源文件里也的包含一份 index.html 下面开始代码: 懒加载WKWebView 引入#import <WebKit/WebKit.h> #import <WebKit/WKWebView.h> 继承 WKNavigationDelegate,WKUI

  • 详解使用JRebel插件实现SpringBoot应用代码热加载

    前言 在实际的开发过程中,我们经常修改代码之后,手动的重启项目,查看修改效果.那么有没有一种方式能够快速的.自动的帮我们将修改代码自动更新,避免手动重启,从而提高开发效率呢?是有的,在我之前的文章里面给读者介绍了使用springboot-devtools实现热加载的方法.本文就给大家介绍另外一种方式:使用Jrebel插件完成修改代码及资源的自动更新功能. 但是对于这个功能很多人对功能的叫法有争议,笔者查询了维基百科.官方文档,没有得到合理的答案,也没有权威的定义,笔者知道的就有:热启动.热加载.

  • 如何正确控制springboot中bean的加载顺序小结篇

    1.为什么需要控制加载顺序 springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题.在此基础上,又提供了spi机制,用spring.factories可以完成一个小组件的自动装配功能. 在一般业务场景,可能你不大关心一个bean是如何被注册进spring容器的.只需要把需要注册进容器的bean声明为@Component即可,spring会自动扫描到这个Bean完成初始化并加载到spring上下文容器. 而当你在项目启动时需要提前做一个业务的初始化工作时,或者你正在开发某个中间

  • Thinkphp 框架配置操作之配置加载与读取配置实例分析

    本文实例讲述了Thinkphp 框架配置操作之配置加载与读取配置.分享给大家供大家参考,具体如下: 配置加载 在ThinkPHP中,一般来说应用的配置文件是自动加载的,加载的顺序是: 惯例配置->应用配置->模式配置->调试配置->状态配置->模块配置->扩展配置->动态配置 以上是配置文件的加载顺序,因为后面的配置会覆盖之前的同名配置(在没有生效的前提下),所以配置的优先顺序从右到左. 不同的配置文件的区别和位置: 惯例配置 惯例重于配置是系统遵循的一个重要思想

  • SpringBoot项目实战之数据交互篇

    目录 前言 1.数据格式 1.1.Json报文 1.2.Xml报文 2.接口规范 2.1.响应报文规范 2.2.请求数据规范 3.参数校验 3.1.简单参数校验 3.2.复杂参数校验 3.2.1.正则表达式校验 3.2.2.自定义校验注解 总结 前言 SpringBoot 非常适合 Web 应用开发,我们可以使用它轻松地建立一个 Web 服务.在Spring Boot入门 里面,我们已经使用其实现一个非常简单的接口,输出了 Hello World!下面我们模拟真实的场景来学习 SpringBoo

随机推荐