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
相关产品推荐
相关产品推荐

