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

简介: Resource接口抽象出一种更底层的方式管理资源,可以实现通过统一的方式处理各类文件资源。下面是几种获取资源实例的方法。

image.png

该图片由Marna Buys在Pixabay上发布


你好,我是看山。


本文聊一聊在 SpringBoot 应用中,访问加载类路径(classpath)中的文件内容的多种方法。


通过Resource接口

Resource接口抽象出一种更底层的方式管理资源,可以实现通过统一的方式处理各类文件资源。下面是几种获取资源实例的方法。


手动加载

访问类路径中的文件,我们可以直接使用ClassPathResource加载内容,比如:


new ClassPathResource("data/resource-data.txt");

默认情况下,ClassPathResource会在线程的上下文类加载器和默认系统类加载器之间进行选择,以删除样板文件。我们也可以直接指定类加载器,比如:


new ClassPathResource("data/resource-data.txt", this.getClass().getClassLoader());

1

或者是通过指定类的类加载器:


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"));
}

读取完毕。


文末总结

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


《SpringBoot 实战》是一个系列,我会通过实战+原理的方式完整整个专栏,可以关注公众号「看山的小屋」回复 spring 获取源码。


推荐阅读

SpringBoot 实战:一招实现结果的优雅响应

SpringBoot 实战:如何优雅的处理异常

SpringBoot 实战:通过 BeanPostProcessor 动态注入 ID 生成器

SpringBoot 实战:自定义 Filter 优雅获取请求参数和响应结果

SpringBoot 实战:优雅的使用枚举参数

SpringBoot 实战:优雅的使用枚举参数(原理篇)

SpringBoot 实战:在 RequestBody 中优雅的使用枚举参数

SpringBoot 实战:在 RequestBody 中优雅的使用枚举参数(原理篇)

SpringBoot 实战:JUnit5+MockMvc+Mockito 做好单元测试

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

目录
相关文章
|
5月前
|
存储 前端开发 Java
SpringBoot使用云端资源url下载文件的接口写法
在Spring Boot中实现从云端资源URL下载文件的功能可通过定义REST接口完成。示例代码展示了一个`FileDownloadController`,它包含使用`@GetMapping`注解的方法`downloadFile`,此方法接收URL参数,利用`RestTemplate`下载文件,并将文件字节数组封装为`ByteArrayResource`返回给客户端。此外,通过设置HTTP响应头,确保文件以附件形式下载。这种方法适用于从AWS S3或Google Cloud Storage等云服务下载文件。
485 7
|
2月前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
7月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的高校实验室资源综合管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的高校实验室资源综合管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
2月前
|
Java Shell C++
Springboot加载注入bean的方式
本文详细介绍了Spring Boot中Bean的装配方法。首先讲解了使用@Component、@Service、@Controller、@Repository等注解声明Bean的方式,并解释了这些注解之间的关系及各自适用的层次。接着介绍了通过@Configuration和@Bean注解定义Bean的方法,展示了其灵活性和定制能力。最后讨论了@Component与@Bean的区别,并提供了在Spring Boot应用中装配依赖包中Bean的三种方法:使用@ComponentScan注解扫描指定包、使用@Import注解导入特定Bean以及在spring.factories文件中配置Bean。
|
3月前
|
消息中间件 NoSQL 安全
(转)Spring Boot加载 不同位置的 application.properties配置文件顺序规则
这篇文章介绍了Spring Boot加载配置文件的顺序规则,包括不同位置的application.properties文件的加载优先级,以及如何通过命令行参数或环境变量来指定配置文件的名称和位置。
|
4月前
|
Java Spring
Spring boot +Thymeleaf 本地图片加载失败(图片路径)的问题及解决方法
这篇文章详细讲解了在Spring Boot应用程序中本地图片无法加载的问题原因,并提供了两个示例来说明如何通过使用正确的相对路径或Thymeleaf语法来解决图片路径问题。
|
4月前
|
缓存 Java 数据库连接
Spring Boot 资源文件属性配置,紧跟技术热点,为你的应用注入灵动活力!
【8月更文挑战第29天】在Spring Boot开发中,资源文件属性配置至关重要,它让开发者能灵活定制应用行为而不改动代码,极大提升了可维护性和扩展性。Spring Boot支持多种配置文件类型,如`application.properties`和`application.yml`,分别位于项目的resources目录下。`.properties`文件采用键值对形式,而`yml`文件则具有更清晰的层次结构,适合复杂配置。此外,Spring Boot还支持占位符引用和其他外部来源的属性值,便于不同环境下覆盖默认配置。通过合理配置,应用能快速适应各种环境与需求变化。
47 0
|
4月前
|
前端开发 JavaScript Java
Spring boot 本地图片不能加载(图片路径)的问题及解决方法
这篇文章讨论了Spring Boot应用程序中本地图片无法加载的问题,通常由图片路径不正确引起,并提供了使用正确的相对路径和Thymeleaf语法来解决这一问题的两种方法。
|
4月前
|
Java 测试技术 Spring
Java SpringBoot 加载 yml 配置文件中字典项
Java SpringBoot 加载 yml 配置文件中字典项
46 0
|
4月前
|
前端开发 JavaScript Java
Spring Boot应用中的资源分离与高效打包实践
通过实施资源分离和高效打包策略,不仅可以提升Spring Boot应用的开发和部署效率,还能显著提高用户体验。在实际项目中,根据项目的实际情况和团队的技术栈选择合适的工具和方案是关键。希望本文能为读者在Spring Boot项目中实现资源分离和高效打包提供一些有价值的参考。