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

【SpringBoot】四种读取 Spring Boot 项目中 jar 包中的 resources 目录下的文件

本文摘要:四种读取 Spring Boot 项目中 jar 包中的 resources 目录下的文件

在这里插入图片描述

😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。公粽号:洲与AI。
🤓 欢迎大家关注!我将分享Web前后端开发、人工智能、机器学习、深度学习从0到1系列文章。
🌼 同时洲洲已经建立了程序员技术交流群,如果您感兴趣,可以私信我加入我的社群~社群中将不定时分享各类福利
🖥 随时欢迎您跟我沟通,一起交流,一起成长、进步!点此即可获得联系方式~

本文目录

  • 前言
  • 代码一:getResourceAsStream()方法
  • 代码二: T.class..getResourceAsStream() 方法
  • 代码三:ClassPathResource 方法
  • 代码四:使用@Value注解注入
  • 总结

前言

在SpringBoot应用中,经常需要读取打包在jar包中的资源文件,比如配置文件、模板文件等。这些资源文件通常放在src/main/resources目录下,在打包成jar包后,它们会被存储在jar包的根目录下。本文将介绍4种在SpringBoot中读取这些资源文件的方法。

部署后,项目是通过打成 jar 包运行的,里面的文件是没有实际路径的(只有相对于项目名的相对路径)。
在这里插入图片描述

代码一:getResourceAsStream()方法

这是一个公共方法,用来读取文件中的内容的方法,通过T.class.getClassLoader().getResourceAsStream() 方法。

比如要读取 config 文件夹下的 test.properties 文件:

public static void printFileContent(Object obj) throws IOException {if (null == obj) {throw new RuntimeException("参数为空");}BufferedReader reader = null;// 如果是文件路径if (obj instanceof String) {reader = new BufferedReader(new FileReader(new File((String) obj)));// 如果是文件输入流} else if (obj instanceof InputStream) {reader = new BufferedReader(new InputStreamReader((InputStream) obj));}String line = null;while ((line = reader.readLine()) != null) {System.out.println(line);}reader.close();
}

此方法是从 classpath 路径(即:src 或 resources 路径下)下查找文件的,所以,路径前不需要加 “/”。

读取方法:

public class ResourceUtil {public void getResource(String fileName) throws IOException{InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName);printFileContent(in);}public static void main(String[] args) throws IOException {new ResourceUtil().getResource("config/test.properties");}
}

在这里插入图片描述

代码二: T.class…getResourceAsStream() 方法

public void getResource2(String fileName) throws IOException{InputStream in = this.getClass().getResourceAsStream("/" + fileName);printFileContent(in);
}
public static void main(String[] args) throws IOException {new ResourceUtil().getResource2("config/test.properties");
}

本方法是从 classpath 路径(即:src 或 resources 路径下)下查找文件的,但它的路径前需要加 “/” ,这个是跟读取的文件与当前.class 文件的位置有关。

可以看看编译后的文件路径:
在这里插入图片描述
当前文件 ResourceUtil.class 与要加载的文件 test.properties 的位置如上: test.properties 和 ResourceUtil.class 不在同一个文件夹下,所以读取的时候是要带上相对路径的,那么,这会有两种情况:

  • 如果 test.properties 和 ResourceUtil 在同一个文件夹下,那么:this.getClass().getResourceAsStream(“test.properties”)

  • 如果 test.properties 和 ResourceUtil 不在同一个文件夹下,那么:this.getClass().getResourceAsStream(“/config/test.properties”)

代码三:ClassPathResource 方法

public void getResource3(String fileName) throws IOException{ClassPathResource classPathResource = new ClassPathResource(fileName);printFileContent(classPathResource.getInputStream());
}
public static void main(String[] args) throws IOException {new ResourceUtil().getResource3("config/test.properties");
}

代码四:使用@Value注解注入

SpringBoot提供了@Value注解,它可以用来注入配置文件中的值,包括从jar包中的资源文件中读取。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class ConfigPropertiesReader {@Value("${app.config.value}")private String configValue;public void printConfigValue() {System.out.println("Config Value: " + configValue);}
}

在application.properties或application.yml文件中,可以这样指定资源文件的位置:

app.config.value=classpath:config.properties

总结

Hello,各位看官老爷们好,洲洲已经建立了CSDN技术交流群,如果你很感兴趣,可以私信我加入我的社群。

📝社群中不定时会有很多活动,例如每周都会包邮免费送一些技术书籍及精美礼品、学习资料分享、大厂面经分享、技术讨论、行业大佬创业杂谈等等。

📝社群方向很多,相关领域有Web全栈(前后端)、人工智能、机器学习、自媒体变现、前沿科技文章分享、论文精读等等。

📝不管你是多新手的小白,都欢迎你加入社群中讨论、聊天、分享,加速助力你成为下一个技术大佬!也随时欢迎您跟我沟通,一起交流,一起成长。变现、进步、技术、资料、项目、你想要的这里都会有

📝欢迎您加入社群~一个人可以或许可以走的很快,但一群人将走的更远!

📝关注我的公众号(与CSDN同ID:洲与AI)可以获得一份Java 10万字面试宝典及相关资料!~

📝想都是问题,做都是答案!行动起来吧!欢迎评论区or后台与我沟通交流,也欢迎您点击下方的链接直接加入到我的交流社群!~ 跳转链接社区~

在这里插入图片描述

相关文章:

【SpringBoot】四种读取 Spring Boot 项目中 jar 包中的 resources 目录下的文件

本文摘要:四种读取 Spring Boot 项目中 jar 包中的 resources 目录下的文件 😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。公粽号&#xf…...

掌控未来,爱普生SR3225SAA用于汽车钥匙、射频电路的智慧引擎

为了响应市场需求,Epson使用独家QMEMS*2技术所生产的石英振荡器,与其精巧的半导体技术所制造的射频传输器电路,开发了SR3225SAA。不仅内建的石英震荡器之频率误差仅有2 ppm,更使其封装尺寸达仅3.2 mm x 2.5 mm,为客户大…...

第五届武汉纺织大学ACM程序设计竞赛 个人题解(待补完)

前言: 上周周日教练要求打的一场重现赛,时长五个小时,题目难度还行,除了部分题目前我还写不出来之外,大部分题都写完或补完了,这边给出比赛链接和我的代码(有些是队友的)和题解。 正…...

LeetCode---哈希表

242. 有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 代码示例: //时间复杂度: O(n) //空间复杂度: O(1) c…...

Python知识点13---面向对象的编程

提前说一点:如果你是专注于Python开发,那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了,而如果你和作者一样只是操作其他技术的Python API那就足够了。 Python是一个完全面向对象开发的语言,它的一切都以对象的…...

Android Dialog软键盘弹出问题完美解决办法

一、问题: Dialog中有输入框时,显示后无法自动弹起软键盘,原因就不赘述了,自行Google。 一、解决办法: 开启独立线程,线程中使用while循环,循环调用弹起软键盘方法,直至showSoftI…...

【C++】C++入门1.0

鼠鼠最近在学C,那么好,俺来做笔记了! 目录 1.C关键字(C98) 2.命名空间 2.1.命名空间定义 2.2.命名空间的使用 3.C的输入&&输出 4.缺省参数 4.1缺省参数概念 4.2.缺省参数的分类 5.函数重载 5.1.函数重载概念 5.2.C支持函数…...

springboot实现文件上传功能,整合云服务

文章目录 这是springboot案例的,文件上传功能的拆分,本篇将带大家彻底了解文件上传功能,先从本地存储再到云存储,全网最详细版本,保证可以学会,可以了解文件上传功能的开发文件上传功能剖析进行书写一个小的文件上传文件上传的文件三要素首先表单提交的方式要是 post方式,第二个…...

接口interfance的基本使用

一.为什么有接口? 接口:就是一种规则。 二.接口的定义和使用 1.接口用关键字interface来定义 public interface 接口名{} 2.接口不能实例化 3.接口和类之间是实现关系,通过implements关键字表示 4.接口的子类(实现类) 注意1: 接口和类的实现关系…...

Gitlub如何删除分支(删除远程分支+本地分支)

目录 背景 删除方法 总结 背景 想要删除自己在本地创建的并已上传到远程分支中的分支。 删除方法 1)删除远程分支 git push origin --delete brannchname 2)删除本地分支 先切换到其他分支 git checkout otherbranch 删除本地分支 git bran…...

使用RSA算法加密字符串:从基础到实现 - Python

在现代数据安全中,加密算法起着至关重要的作用。特别是非对称加密算法,如RSA(Rivest-Shamir-Adleman),广泛应用于保护敏感信息的传输。本文将详细介绍如何使用RSA算法加密和解密字符串,包括生成密钥对、加密…...

MFC实现守护进程,包括开机自启动、进程单例、进程查询、进程等待、重启进程、关闭进程

在Windows平台上实现一个守护进程,由于与系统有关,所有使用MFC来实现是最合适的,被守护的进程则不限语言。废话不多,直接开整。 目录 1. 开机自启动 2. 进程单例 3. 进程查询 4. 进程等待 5. 重启进程 6. 关闭进程 7、最后…...

Spark SQL数据源 - Parquet文件

当使用Spark SQL处理Parquet文件时,你可以使用spark.read.parquet()方法从文件系统中加载Parquet数据到一个DataFrame中。Parquet是一种列式存储格式,非常适合用于大数据集,因为它提供了高效的压缩和编码方案。 以下是一个简单的例子&#x…...

eNsp——两台电脑通过一根网线直连通信

一、拓扑结构 二、电脑配置 ip和子网掩码,配置两台电脑处于同一网段 三、测试 四、应用 传文件等操作,可以在一台电脑上配置FTP服务器...

杂牌记录仪TS视频流恢复方法

大多数的记录仪都采用了MP4/MOV文件方案,极少数的可能在用AVI文件,极极少数的在用TS文件方案。很多人可能不太解TS文件,这是一种古老的视频文件结构,下边这个案例我们来看下TS视频文件的恢复方法。 故障存储:8G存储卡/fat32文件系…...

十_信号7-信号集

int sigemptyset(sigset_t *set); 清空信号集 int sigfillset(sigset_t *set); 填充满 信号集 int sigaddset(sigset_t *set, int signum); 向信号集中添加信号 int sigdelset(sigset_t *set, int signum); 从型号集中删除信号 int sigismember(const sigset_t *set, int s…...

GPT-4o

微软最新发布的CopilotPC采用了OpenAI最新的GPT-4o技术,新增了多项强大功能。以下是主要的新增功能: 更强大的AI处理能力:CopilotPC采用了专门用于AI处理的特殊芯片,使得电脑能够处理更多的人工智能任务,而无需调用云…...

32位与64位程序下函数调用的异同——计科学习中缺失的内容

前言 今天&#xff0c;通过一个有趣的案例&#xff0c;从反编译的角度看一下C语言中函数参数是如何传递的。 创建main.c文件&#xff0c;将下面实验代码拷贝到main.c文件中。 # main.c #include <stdio.h>int test(int a, int b, int c, int d, int e, int f, int g, …...

Python爬虫实战(实战篇)—16获取【百度热搜】数据—写入Ecel(附完整代码)

文章目录 专栏导读背景结果预览1、爬取页面分析2、通过返回数据发现适合利用lxmlxpath3、继续分析【小说榜、电影榜、电视剧榜、汽车榜、游戏榜】4、完整代码总结 专栏导读 &#x1f525;&#x1f525;本文已收录于《Python基础篇爬虫》 &#x1f251;&#x1f251;本专栏专门…...

js切割数组的两种方法slice(),splice()

slice() 返回一个索引和另一个索引之间的数据(不改变原数组),slice(start,end)有两个参数(start必需,end选填),都是索引,返回值不包括end 用法和截取字符串一样 splice() 用来添加或者删除数组的数据,只返回被删除的数据,类型为数组(改变原数组) var heroes["李白&q…...

用知识图谱重构搜索引擎

一、传统搜索&#xff1a;关键词的“机械匹配”时代你输入词&#xff0c;它找文档我们熟悉的搜索引擎&#xff0c;无论是早期的Google还是百度的首页&#xff0c;核心逻辑都是关键词匹配。你输入“苹果热量”&#xff0c;它就把互联网里包含“苹果”和“热量”两个词的网页抓出…...

Windows环境5步搞定OpenCore引导盘:Hackintosh安装终极指南

Windows环境5步搞定OpenCore引导盘&#xff1a;Hackintosh安装终极指南 【免费下载链接】OpenCore-Install-Guide Repo for the OpenCore Install Guide 项目地址: https://gitcode.com/gh_mirrors/op/OpenCore-Install-Guide 想要在普通PC上体验macOS的流畅与优雅吗&am…...

Global Mapper 26空间数据转换安装教程 Windows版:自定义路径+Crack替换指南

它以出色的格式兼容性&#xff08;支持数百种矢量和栅格格式&#xff0c;如 CAD、SHP、GeoTIFF 等&#xff09;和高效的数据处理能力著称&#xff0c;广泛应用于测绘、林业、矿业及土地规划领域。 一、准备工作 安装包下载&#xff1a;https://pan.quark.cn/s/a361bbddd854&a…...

别再用土办法改论文了!书匠策AI官网www.shujiangce.com才是2025届毕业生的“通关密码“

你有没有经历过这种崩溃瞬间&#xff1f; 凌晨两点&#xff0c;你对着电脑屏幕&#xff0c;查重率39%&#xff0c;AIGC疑似率67%。导师发来一条消息&#xff1a;"这篇不像你写的&#xff0c;重写。" 那一刻&#xff0c;你是不是特别想问一句&#xff1a;我到底该怎…...

低压电工-架空线路,室内线路

前置基础补充 线路核心定义电能输送用的电线线路统称电气线路&#xff0c;电工考证只重点学电力线路&#xff08;送电、供电&#xff09;&#xff0c;不学控制线路&#xff08;设备内部控制线&#xff09;。电压基础 低压&#xff1a;1000V 及以下&#xff08;日常家用、工厂…...

25款经典老芯片回顾:从运放、逻辑门到MCU,重温电子工程基石

1. 引言&#xff1a;一场跨越时代的芯片“认亲大会”最近在整理工作室的旧物料箱&#xff0c;翻出了一堆尘封已久的芯片&#xff0c;从布满灰尘的DIP封装到早已停产的早期逻辑门&#xff0c;每一片都像一张泛黄的老照片&#xff0c;记录着电子工业发展的一个脚印。我随手拍了几…...

零基础学 Web 安全 20256最全系统入门攻略

“未知攻&#xff0c;焉知防”——真正的安全始于理解攻击者的思维 在日益数字化的世界中&#xff0c;Web安全工程师已成为企业防护体系的“数字盾牌”。本文将提供一条清晰的进阶路径&#xff0c;助你在2025年的网络安全领域脱颖而出。 一、认知篇&#xff1a;理解安全本质 …...

AI应用可观测性工程:像监控微服务一样监控你的LLM应用

LLM 应用进入生产后&#xff0c;“为什么这次回答质量差&#xff1f;”、"哪次调用导致成本飙升&#xff1f;"这些问题如果没有完整的可观测性体系&#xff0c;根本无法回答。本文构建 LLM 应用的完整监控体系。LLM 应用监控的独特挑战传统微服务监控关注的是&#x…...

跨国分布式团队协作实录:时区差不是最大障碍,信任才是

一、跨越时区&#xff1a;测试协作的“隐形战场”在全球化软件交付的浪潮中&#xff0c;跨国分布式测试团队早已成为行业标配。当上海的测试工程师迎着朝阳开始一天的工作时&#xff0c;旧金山的同事正披着夜色结束任务&#xff1b;当柏林团队在梳理测试用例&#xff0c;班加罗…...

Onekey Steam清单下载工具:3步搞定游戏清单管理的终极指南

Onekey Steam清单下载工具&#xff1a;3步搞定游戏清单管理的终极指南 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 在Steam游戏生态中&#xff0c;清单文件是连接游戏客户端与服务器资源的关…...