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

Java项目跨目录读取JSON配置文件遇FileNotFoundException如何解决?

解决Java读取跨目录JSON配置文件时的FileNotFoundException问题

问题背景

项目结构如下:

project |
--- configuration |
------- jarvis-tags |
----------- ConfigurableJarvisTags.json |
--- src
------ [自定义类目录]|
--------- MyClass |
--- test |
------ [测试类目录] |
---------- MyClassTest |

读取配置文件的代码片段:

try {
    final InputStream pathToConfigurableJarvisTagFile = new FileInputStream("/configuration/jarvis-tags/ConfigurableJarvisTags.json");
    fileReader = new InputStreamReader(pathToConfigurableJarvisTagFile, StandardCharsets.UTF_8);
}

抛出异常:

java.io.FileNotFoundException: /configuration/jarvis-tags/ConfigurableJarvisTags.json (No such file or directory)
[junit] java.lang.RuntimeException: java.io.FileNotFoundException: /configuration/jarvis-tags/ConfigurableJarvisTags.json (No such file or directory)

核心问题:代码中使用的/configuration/...是系统根目录下的绝对路径,而非项目内部的相对路径,导致程序找不到文件。

解决方案

方案1:使用类加载器读取(推荐,适配开发/打包后场景)

通过类加载器从类路径中读取资源,无需关心具体文件系统路径,打包成jar后也能正常访问。

try {
    // 通过当前类获取资源流,路径以/开头代表类路径根目录
    InputStream inputStream = MyClass.class.getResourceAsStream("/configuration/jarvis-tags/ConfigurableJarvisTags.json");
    if (inputStream == null) {
        throw new FileNotFoundException("配置文件未找到,请确认资源目录配置");
    }
    fileReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
    // 后续JSON解析操作
} catch (IOException e) {
    e.printStackTrace();
}

注意:需要将configuration目录标记为资源目录(比如IDEA中右键目录选择「Mark Directory as > Resources Root」;Maven项目可在pom.xml的<resources>节点中配置该目录)。

方案2:基于项目根目录的相对路径读取

适用于开发环境本地运行,路径以项目根目录为起点,去掉开头的斜杠:

try {
    // 相对路径对应项目根目录下的configuration文件夹
    File configFile = new File("configuration/jarvis-tags/ConfigurableJarvisTags.json");
    InputStream inputStream = new FileInputStream(configFile);
    fileReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
} catch (IOException e) {
    e.printStackTrace();
}

注意:运行程序时需确保工作目录为项目根目录(IDE默认满足此条件,打包后运行需保证配置文件位于jar包同级的对应路径下)。

测试环境适配

如果是运行单元测试时出现问题,同样可以使用方案1的类加载器方式;或者将配置文件复制到test/resources目录下,确保测试代码能访问到。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:55:19