看完!我不允许你还不知道 Spring Boot如何读取Resource目录文件

看完!我不允许你还不知道 Spring Boot如何读取Resource目录文件
在这里插入图片描述
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》专栏19年编写主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
🌛《开源项目》本专栏主要介绍目前热门的开源项目,带大家快速了解并轻松上手使用
🍎 《前端技术》专栏以实战为主介绍日常开发中前端应用的一些功能以及技巧,均附有完整的代码示例
✨《开发技巧》本专栏包含了各种系统的设计原理以及注意事项,并分享一些日常开发的功能小技巧
💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程
🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整
👍《Spring Security》专栏中我们将逐步深入Spring Security的各个技术细节,带你从入门到精通,全面掌握这一安全技术
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

看完!我不允许你还不知道Spring Boot如何读取Resource目录文件

1. 前言

在Spring Boot开发中,我们经常需要读取src/main/resources目录下的文件,src/main/resources 目录下通常存放配置文件、模板、静态资源、SQL脚本等,如何在运行时读取这些资源,是每个JAVA开发者必须掌握的技能。

在这里插入图片描述

比如下面的Spring Boot项目中,资源文件的存储位置:

src/ └── main/ └── resources/ ├── static/ # 静态资源 ├── templates/ # 模板文件 ├── config/ # 配置文件 └── data/ # 数据文件 

本文博主将将从多种角度详细介绍在 Spring Boot中读取类路径(classpath)下资源的方法,并给出完整的代码示例,相信小伙伴们看完一定能掌握这个技巧!


2. 读取Resource文件的五种常见方式

2.1 使用 ClassPathResource(推荐)

Spring 提供了 ClassPathResource,可直接从类路径获取资源

importorg.springframework.core.io.ClassPathResource;importorg.springframework.util.FileCopyUtils;importjava.io.InputStreamReader;importjava.nio.charset.StandardCharsets;publicclassResourceReader{publicStringreadWithClassPathResource(String filePath)throwsException{ClassPathResource resource =newClassPathResource(filePath);try(InputStreamReader reader =newInputStreamReader( resource.getInputStream(),StandardCharsets.UTF_8)){returnFileCopyUtils.copyToString(reader);}}}

测试示例:

String content =readWithClassPathResource("data/sample.txt");System.out.println(content);

2.2 使用 ResourceLoader

ResourceLoaderSpring 上下文提供的通用资源加载接口,支持多种前缀(classpath:、file:、http: 等

importorg.springframework.core.io.Resource;importorg.springframework.core.io.ResourceLoader;importorg.springframework.stereotype.Component;importjava.io.IOException;importjava.nio.charset.StandardCharsets;@ComponentpublicclassResourceService{privatefinalResourceLoader resourceLoader;publicResourceService(ResourceLoader resourceLoader){this.resourceLoader = resourceLoader;}publicStringreadWithResourceLoader(String location)throwsException{Resource resource = resourceLoader.getResource(location);try(InputStream in = resource.getInputStream()){byte[] bytes = in.readAllBytes();returnnewString(bytes,StandardCharsets.UTF_8);}}}

测试示例:

// 读取 classpath 下的 sample.txtString text = resourceLoaderService.readWithResourceLoader("classpath:data/sample.txt");

2.3 使用 @Value 注解

如果只是读取小片段文本或 URL,可直接在字段或方法参数上使用 @Value

importorg.springframework.beans.factory.annotation.Value;importorg.springframework.core.io.Resource;importorg.springframework.stereotype.Component;importjava.io.IOException;importjava.nio.charset.StandardCharsets;@ComponentpublicclassValueResourceReader{@Value("classpath:data/sample.txt")privateResource configFile;publicStringreadConfig()throwsIOException{returnnewString(configFile.getInputStream().readAllBytes(),StandardCharsets.UTF_8);}}

2.4 使用 ResourceUtils

ResourceUtilsSpring 内置的一个工具类, 可以将类路径资源转换为 FileURL,适用于需要 java.io.File 操作的场景

importorg.springframework.stereotype.Service;importorg.springframework.util.ResourceUtils;importjava.io.File;importjava.nio.file.Files;importjava.nio.charset.StandardCharsets;@ServicepublicclassResourceUtilsService{publicStringreadWithResourceUtils(String location)throwsException{// location 形如:"classpath:data/sample.txt"File file =ResourceUtils.getFile(location);byte[] bytes =Files.readAllBytes(file.toPath());returnnewString(bytes,StandardCharsets.UTF_8);}}

2.5 通过 getResourceAsStream

最原生的方式:通过 ClassClassLoadergetResourceAsStream

importorg.springframework.stereotype.Service;importjava.io.BufferedReader;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.nio.charset.StandardCharsets;importjava.util.stream.Collectors;@ServicepublicclassNativeStreamService{publicStringreadWithGetResourceAsStream(String path){try(InputStream in =this.getClass().getClassLoader().getResourceAsStream(path);BufferedReader reader =newBufferedReader(newInputStreamReader(in,StandardCharsets.UTF_8))){return reader.lines().collect(Collectors.joining(System.lineSeparator()));}catch(Exception e){thrownewRuntimeException("读取资源失败", e);}}}

补充:读取Properties文件

有小伙伴说,读取的配置文件是Properties文件,要如何来读取?下面博主做一个补充,依然使用 ClassPathResource 读取文件

importorg.springframework.core.io.ClassPathResource;importjava.io.IOException;importjava.io.InputStream;importjava.util.Properties;publicclassPropertiesReader{publicPropertiesreadProperties(String filePath)throwsIOException{ClassPathResource resource =newClassPathResource(filePath);try(InputStream input = resource.getInputStream()){Properties properties =newProperties(); properties.load(input);return properties;}}}

3. 完整实战案例:读取CSV文件并处理

下面我们通过一个实战案例,来加深小伙伴的理解

3.1 创建测试文件

src/main/resources/data/ 下创建users.csv:

id,name,email 1,张三,[email protected],李四,[email protected]

3.2 创建CSV处理器

importorg.springframework.core.io.ClassPathResource;importorg.springframework.stereotype.Service;importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.util.ArrayList;importjava.util.List;@ServicepublicclassCsvService{publicList<User>parseCsv(String filePath)throwsException{ClassPathResource resource =newClassPathResource(filePath);List<User> users =newArrayList<>();try(BufferedReader reader =newBufferedReader(newInputStreamReader(resource.getInputStream()))){// 跳过标题行String line = reader.readLine();while((line = reader.readLine())!=null){String[] parts = line.split(",");if(parts.length ==3){ users.add(newUser(Integer.parseInt(parts[0]), parts[1], parts[2]));}}}return users;}publicstaticclassUser{privateint id;privateString name;privateString email;// 构造方法、getters和toString}}

3.3 创建Controller测试

importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;importjava.util.List;@RestControllerpublicclassCsvController{privatefinalCsvService csvService;publicCsvController(CsvService csvService){this.csvService = csvService;}@GetMapping("/users")publicList<CsvService.User>getUsers()throwsException{return csvService.parseCsv("data/users.csv");}}
启动应用后访问:http://localhost:8080/users

输出结果
看到输出如下数据证明已经读取成功

[{"id":1,"name":"张三","email":"[email protected]"},{"id":2,"name":"李四","email":"[email protected]"}]

4. 常见问题解决方案

问题1:文件路径错误

错误信息:java.io.FileNotFoundException: class path resource [xxx] cannot be opened because it does not exist

解决方案:

检查文件是否在src/main/resources目录下
使用正确路径(区分大小写)
文件路径前不要加/(正确:data/file.txt,错误:/data/file.txt)

问题2:打包后文件读取失败

错误信息:FileNotFoundException when reading from JAR

解决方案:

使用ClassPathResource而不是File
避免使用new File(“classpath:…”)语法
使用getResourceAsStream()方法

问题3:读取Resource目录文件中文乱码

解决方案:

// 明确指定UTF-8编码newInputStreamReader(resource.getInputStream(),StandardCharsets.UTF_8);

5. 总结

Spring Boot提供了多种灵活的方式来读取resource目录下的文件。根据不同场景选用最合适的方式:

  • 如果需要 Spring 统一管理,推荐 ResourceLoader
  • 若只是简单注入小文件,可选 @Value;
  • 如果需要操作 File,可用 ResourceUtils。

掌握这些方法,能让小伙伴们在处理配置、模板、静态资源等场景时更得心应手,如果你在实践过程中有任何疑问或更好的扩展思路,欢迎在评论区留言,最后希望大家一键三连给博主一点点鼓励!


专栏最新回顾
【01】ThreadLocal的原理以及实际应用技巧详解 - 如何在身份认证场景Token中传递获取用户信息
【02】基于MyBatis-Plus Dynamic-Datasource实现 SaaS 系统动态租户数据源管理
【03】基于nacos实现动态线程池设计与实践:告别固定配置,拥抱弹性调度
【04】Java常用加密算法详解与实战代码 - 附可直接运行的测试示例
【05】Java synchronized 锁机制深度解析与实战指南 - 银行转账案例
【06】还在为线上BUG苦苦找寻?试试IntelliJ IDEA远程调试线上Java程序
【07】使用 Apache Commons Exec 自动化脚本执行实现 MySQL 数据库备份
【08】JAVA开发中几个常用的lambda表达式!记得收藏起来哦~

Read more

Flutter 三方库 icapps_translations 的鸿蒙化适配指南 - 打造现代化的国际化方案、助力鸿蒙全场景应用多语言动态管理

Flutter 三方库 icapps_translations 的鸿蒙化适配指南 - 打造现代化的国际化方案、助力鸿蒙全场景应用多语言动态管理

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 icapps_translations 的鸿蒙化适配指南 - 打造现代化的国际化方案、助力鸿蒙全场景应用多语言动态管理 前言 随着 OpenHarmony 鸿蒙生态迈向全球化(Global Harmony),应用的多语言国际化(i18n)适配显得尤为关键。鸿蒙系统本身提供了完善的资源管理机制,但在 Flutter 为主的跨端开发中,如何更优雅地管理成百上千个翻译词条,并支持无需发版即可更新的动态翻译能力?icapps_translations 作为一套成熟的国际化辅助框架,通过强类型的翻译访问和简洁的资源组织形式,能极大提升开发体验。本文将详细介绍如何在鸿蒙应用中深度集成 icapps_translations,构建一个既符合鸿蒙系统规范又具备高度灵活性的国际化架构。 一、原理解析 / 概念介绍 1.1 基础原理 icapps_translations 的核心设计哲学是强类型安全 (Strongly Typed Localiza

By Ne0inhk

MacOS中安装并配置Redis

MacOS中安装并配置Redis 1. 安装 Redis 进入 homebrew 官网,按照给的命令下载 homebrew 。 /bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)” 接下来,执行命令安装 Redis。 brew install redis 然后使用find / -name "redis.conf"命令查找redis.conf文件的位置,并稍微修改一下,我的MacOS mini4小主机中的redis.conf文件有如下两个路径,修改其中一个都可以: /opt/homebrew/etc/redis.conf /opt/homebrew/Cellar/

By Ne0inhk
Flutter 组件 whitecodel_auto_link 适配鸿蒙 HarmonyOS 实战:交互式文本探针,构建信息流自动链接识别与极速预览架构

Flutter 组件 whitecodel_auto_link 适配鸿蒙 HarmonyOS 实战:交互式文本探针,构建信息流自动链接识别与极速预览架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 whitecodel_auto_link 适配鸿蒙 HarmonyOS 实战:交互式文本探针,构建信息流自动链接识别与极速预览架构 前言 在鸿蒙(OpenHarmony)生态迈向深度社交、企业办公及即时通讯全场景覆盖的背景下,如何将枯燥的长文本转化为具备可交互能力的“信息枢纽”,已成为提升用户操作效率的关键。在鸿蒙设备这类强调分布式协同与智慧感知的移动终端上,如果应用仅能显示纯文本,而无法识别其中的网址(URL)、邮箱(Email)或电话(Phone),用户就必须通过复杂的“长按、复制、切换应用、粘贴”链路来处理信息,这极大地割裂了鸿蒙系统的流转体验。 我们需要一种能够自动扫描文本特征、支持多维热点识别且具备高性能渲染能力的富文本处理引擎。 whitecodel_auto_link 为 Flutter 开发者引入了极其简便的长文本自动链接方案。它通过内置的高精度正则匹配矩阵,自动将文本中的特定识别域转化为可点击的高亮区域。在适配到鸿蒙

By Ne0inhk
鸿蒙金融理财全栈项目——生态合作、用户运营、数据变现优化

鸿蒙金融理财全栈项目——生态合作、用户运营、数据变现优化

《鸿蒙APP开发从入门到精通》第24篇:鸿蒙金融理财全栈项目——生态合作、用户运营、数据变现优化 🚀🤝📈 内容承接与核心价值 这是《鸿蒙APP开发从入门到精通》的第24篇——生态合作、用户运营、数据变现优化篇,100%承接第23篇的性能优化、安全加固优化、合规审计优化架构,并基于金融场景的生态合作、用户运营、数据变现优化要求,设计并实现鸿蒙金融理财全栈项目的生态合作、用户运营、数据变现优化功能。 学习目标: * 掌握鸿蒙金融理财项目的生态合作设计与实现; * 实现生态合作协议、生态合作接口、生态合作数据; * 理解用户运营优化在金融场景的核心设计与实现; * 实现用户分群优化、用户画像优化、用户留存优化; * 掌握数据变现优化在金融场景的设计与实现; * 实现广告变现优化、付费变现优化、数据产品变现优化; * 优化金融理财项目的用户体验(生态合作、用户运营、数据变现优化)。 学习重点: * 鸿蒙金融理财项目的生态合作设计原则; * 用户运营优化在金融场景的应用; * 数据变现优化在金融场景的设计要点。 一、 生态合作基础 🎯 1.1 生态

By Ne0inhk