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

如何在Spring Boot中读取JAR包内resources目录下文件

精心整理了最新的面试资料和简历模板,有需要的可以自行获取

点击前往百度网盘获取
点击前往夸克网盘获取

以下是如何在Spring Boot中读取JAR包内resources目录下文件的教程,分为多种方法及详细说明:


方法1:使用 ClassPathResource (Spring框架推荐)

适用于Spring环境,能自动处理类路径资源。

import org.springframework.core.io.ClassPathResource;
import java.io.InputStream;
import org.apache.commons.io.IOUtils;

public String readFileWithClassPathResource() throws IOException {
    // 指定文件路径(相对于src/main/resources)
    ClassPathResource resource = new ClassPathResource("files/example.txt");
    
    try (InputStream inputStream = resource.getInputStream()) {
        // 将文件内容转为字符串(需Apache Commons IO依赖)
        return IOUtils.toString(inputStream, StandardCharsets.UTF_8);
    }
}
注意事项:
  • 路径无需以/开头(如"files/example.txt")。
  • 文件应放在src/main/resources/files/example.txt

方法2:使用 ClassLoader.getResourceAsStream() (Java原生方法)

无需依赖Spring,适用于纯Java环境。

public String readFileWithClassLoader() throws IOException {
    // 获取ClassLoader
    ClassLoader classLoader = getClass().getClassLoader();
    
    // 指定文件路径(路径以"/"开头表示从resources根目录开始)
    try (InputStream inputStream = classLoader.getResourceAsStream("files/example.txt")) {
        if (inputStream == null) {
            throw new FileNotFoundException("文件未找到");
        }
        return new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
    }
}
注意事项:
  • 路径是否以/开头会影响查找位置:
    • classLoader.getResourceAsStream("files/example.txt"):从类路径根目录开始。
    • getClass().getResourceAsStream("/files/example.txt"):同上。
    • getClass().getResourceAsStream("files/example.txt"):从当前类所在包目录开始。

方法3:使用 FilesPaths (Java 7+ NIO)

适用于需要Path对象操作的场景,但需注意JAR内文件的限制。

import java.nio.file.Files;
import java.nio.file.Paths;

public String readFileWithNIO() throws IOException {
    // 通过ClassLoader获取文件URL
    java.net.URL url = getClass().getClassLoader().getResource("files/example.txt");
    if (url == null) {
        throw new FileNotFoundException("文件未找到");
    }
    
    // 转换为URI后读取
    return Files.readString(Paths.get(url.toURI()));
}
注意事项:
  • 直接使用Paths.get("src/main/resources/...")在JAR中会失败,必须通过URL获取路径。

常见问题排查

  1. 文件路径错误

    • 检查文件是否在src/main/resources的正确子目录中。
    • 使用IDE的“Build”或“Maven/Gradle编译”后查看target/classesbuild/resources确认文件是否被正确打包。
  2. JAR中无法读取

    • 使用jar tf your-app.jar命令检查文件是否存在于JAR内。
    • 确保使用getResourceAsStreamClassPathResource,而非FileInputStream
  3. 空指针异常

    • 检查getResourceAsStream()返回的InputStream是否为null,并在代码中处理。

文件位置示例

src/main/resources
├── application.properties
└── files
    └── example.txt  # 读取路径为 "files/example.txt"

总结

  • 推荐方法:优先使用ClassPathResource(Spring项目)或ClassLoader.getResourceAsStream()(纯Java)。
  • 避免使用new File("path")FileInputStream,这些在JAR中无法工作。
  • 测试验证:在打包后通过java -jar your-app.jar运行并测试文件读取功能。

通过上述方法,你可以安全地读取JAR包内resources目录下的文件内容。

相关文章:

  • C++查看动态库导出哪些函数以及动态库导出形式
  • vLLM代码推理Qwen2-VL多模态
  • 华为配置篇-OSPF基础实验
  • 【RabbitMQ】Producer之TTL过期时间 - 基于AMQP 0-9-1
  • 【智能体架构:Agent】LangChain智能体类型ReAct、Self-ASK的区别
  • Sentinel-2哨兵2号数据提取指定区域NDVI值,映射冬小麦苗情分级,并且通过前端直接加载tif文件渲染效果
  • TMS320F28P550SJ9学习笔记3:SCI通信的特性与Sysconfig配置发送功能
  • 001.words and phrases
  • Golang实践录:go发布版本信息收集
  • llm + rag
  • VsCode 快捷键备忘
  • <03.05>Leetcode2
  • 如何为亚马逊季节性产品搭建高效的推广流程?
  • 解决新建小程序页面文字顶在顶部问题
  • CyberDefenders----DanaBot Lab
  • 【Java学习】String类变量
  • 电力设备基础概念解析
  • threejs:用着色器给模型添加光带扫描效果
  • 如何下载安装 PyCharm?
  • Libgdx游戏开发系列教程(5)——碰撞反弹的简单实践
  • 《求是》杂志发表习近平总书记重要文章《锲而不舍落实中央八项规定精神,以优良党风引领社风民风》
  • 特朗普中东行:“能源换科技”背后的权力博弈|907编辑部
  • 习近平复信中国丹麦商会负责人
  • 人民日报评外卖平台被约谈:摒弃恶性竞争,实现行业健康发展
  • “75万买299元路由器”事件进展:重庆市纪委等三部门联合介入调查
  • 北美票房|昔日偶像风光不再,乔什·哈内特新片开画不佳