用DefaultResourceLoader加载文件遇FileNotFoundException,路径有效却报错求解决
问题分析与解决方案
错误原因
你使用DefaultResourceLoader.getResource()加载文件时,传入的是本地文件系统的绝对路径,但这个方法的默认逻辑是:当路径以/开头时,会将其视为类路径根目录下的资源路径,而非操作系统的绝对路径。因此它会去项目的类路径(比如target/classes目录或jar包内部)寻找该路径,自然找不到本地磁盘里的文件,最终抛出FileNotFoundException。
解决方法
根据你的实际需求,选择以下两种方案之一:
方案1:直接加载本地文件系统的文件
如果这个文件不需要放入类路径,仅从本地磁盘读取,可通过两种方式处理:
- 方式一:给路径添加
file:前缀
修改调用时的路径,加上file:前缀,让ResourceLoader识别为文件系统资源:streamHelper("file:/Users/my/IdeaProjects/rules-management/data_tacos-sample/post-migration/sourceData/config_-e48059402bd4.json") - 方式二:直接使用
FileInputStream
跳过DefaultResourceLoader,直接通过文件系统读取:private InputStream streamHelper(String resourcePath) throws IOException { return new FileInputStream(new File(resourcePath)); }
方案2:将文件放入类路径加载
如果这个文件属于项目资源,应该放在类路径下管理:
- 将文件移动到项目的
src/main/resources(生产环境)或src/test/resources(测试环境)目录下,例如放在src/main/resources/sourceData/路径下。 - 调用时传入类路径相对路径,去掉绝对路径部分:
streamHelper("sourceData/config_-e48059402bd4.json") - 验证:确保IDE已将
resources目录标记为「资源根目录」,打包后文件会被自动包含在输出的jar/war包中。
内容的提问来源于stack exchange,提问作者EXEC1
相关产品推荐
相关产品推荐

