You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot如何读取resources下文件同时适配IDE运行和java -jar启动

问题原因分析
  • 第一种FileReader写法失败原因:Spring Boot打为jar包后,资源文件存放在jar包内部,不属于操作系统文件系统的独立路径,FileReader只能读取文件系统上的实体文件,无法读取jar包内的资源,因此jar启动时报错;Eclipse运行时资源是解压在本地classes目录下的实体文件,所以可以正常读取。
  • 第二种带前导斜杠的getResourceAsStream写法失败原因:ClassLoader.getResourceAsStream()方法的路径默认从classpath根目录开始匹配,不支持路径开头加/,添加前导斜杠会导致Eclipse环境下的类加载器无法识别路径,返回null;jar运行时的类加载器对前导斜杠做了兼容处理,所以可以正常运行。
兼容两种场景的解决方案

方案1:使用Spring Resource的输入流读取(推荐,Spring项目原生支持)

直接使用Spring Resource抽象的getInputStream()方法读取,不要转换为File对象,Spring会自动适配不同运行环境的资源存储形式:

import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.StandardCharsets;

// 注入ResourceLoader,或者直接使用@Value注入Resource
@Autowired
private ResourceLoader resourceLoader;

public void readJson() throws Exception {
    Resource resourceFetch = resourceLoader.getResource("classpath:MOResponse/UploadResponse.json");
    // 用try-with-resources自动关闭流,指定UTF-8字符集避免乱码
    try (Reader reader = new InputStreamReader(resourceFetch.getInputStream(), StandardCharsets.UTF_8)) {
        // 此处编写读取reader的业务逻辑
    }
}

方案2:修正类加载器的资源路径写法

去掉ClassLoader.getResourceAsStream()路径的前导斜杠即可适配两种环境,可增加兜底判断避免空指针:

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.StandardCharsets;

public void readJson() throws Exception {
    InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream("MOResponse/UploadResponse.json");
    // 兜底兼容极端类加载器场景
    if (resourceAsStream == null) {
        resourceAsStream = getClass().getResourceAsStream("/MOResponse/UploadResponse.json");
    }
    if (resourceAsStream == null) {
        throw new RuntimeException("未找到指定的资源文件");
    }
    try (Reader reader = new InputStreamReader(resourceAsStream, StandardCharsets.UTF_8)) {
        // 此处编写读取reader的业务逻辑
    }
}
注意事项
  • 必须显式指定字符集,不要使用InputStreamReader的无参构造,避免不同操作系统默认字符集不同导致乱码。
  • 使用try-with-resources语法自动关闭输入流,避免资源泄漏。
  • 增加资源非空判断,避免资源不存在时抛出空指针异常。

内容的提问来源于stack exchange,提问作者Happs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 23:00:01