如何在Java中正确读取资源目录下的JSON文件列表

秋丽同学_1078

秋丽同学_1078

2026-03-25

404人浏览

原创

如何在Java中正确读取资源目录下的JSON文件列表

本文讲解如何通过classloader安全获取类路径下的资源目录路径,避免因相对路径错误导致的illegalargumentexception异常,并提供可直接复用的健壮实现方案。

本文讲解如何通过classloader安全获取类路径下的资源目录路径,避免因相对路径错误导致的illegalargumentexception异常,并提供可直接复用的健壮实现方案。

在Java项目中,试图通过硬编码文件系统路径(如 my-app-1/src/main/resources/my_directory)读取JSON文件时,极易触发 java.lang.IllegalArgumentException —— 根本原因在于:该路径是开发时的源码路径,而非运行时实际存在于类路径(classpath)中的位置。当应用打包为JAR或部署到容器中后,new File(".../src/main/resources/...") 指向的物理目录根本不存在,listFiles() 返回 null,进而可能引发空指针或非法参数异常(尤其在后续未校验的链式调用中)。

正确的做法是依赖ClassLoader从类路径定位资源,确保路径解析与部署形态无关。Class.getResource() 或 ClassLoader.getResource() 会自动映射到编译后 resources/ 下的实际位置(如 target/classes/my_directory/ 或 JAR 内部路径),返回一个有效的 URL,再通过 .getPath() 获取可被 File 构造器识别的本地路径(仅适用于文件系统协议,见注意事项)。

以下是推荐实现:

java-enterprise
java-enterprise

Java企业开发专家,专注于Spring Boot、微服务架构和JVM优化。适用于:Java语言掌握、

下载
import java.io.File;
import java.util.*;

public class JsonResourceReader {

    /**
     * 从类路径下指定资源目录读取所有 .json 文件
     * @param resourceDirPath 类路径内的相对目录名(如 "my_directory"),不以 "/" 开头,也不含 src/main/resources
     */
    public List<file> getJsonFiles(String resourceDirPath) {
        // 1. 使用 ClassLoader 定位资源目录(线程上下文类加载器更健壮,兼容多数场景)
        URL resourceUrl = Thread.currentThread().getContextClassLoader()
                .getResource(resourceDirPath);

        if (resourceUrl == null) {
            throw new IllegalArgumentException(
                "Resource directory not found in classpath: " + resourceDirPath);
        }

        // 2. 安全提取文件系统路径(仅支持 file:// 协议;jar:// 需另作处理)
        String path = resourceUrl.getPath();
        File directory = new File(path);

        if (!directory.exists() || !directory.isDirectory()) {
            throw new IllegalArgumentException(
                "Invalid resource directory: " + path);
        }

        // 3. 过滤并返回 JSON 文件列表
        File[] jsonFiles = directory.listFiles(file -> 
            file.isFile() && file.getName().toLowerCase().endsWith(".json")
        );

        return Arrays.asList(jsonFiles != null ? jsonFiles : new File[0]);
    }

    // 示例用法
    public static void main(String[] args) {
        JsonResourceReader reader = new JsonResourceReader();
        try {
            List<file> jsonFiles = reader.getJsonFiles("my_directory");
            System.out.println("Found " + jsonFiles.size() + " JSON files:");
            jsonFiles.forEach(f -> System.out.println("  → " + f.getName()));
        } catch (IllegalArgumentException e) {
            System.err.println("Error: " + e.getMessage());
        }
    }
}</file></file>

✅ 关键优势:

  • ✅ 环境无关:无论运行在IDE、Maven test、Spring Boot fat jar 或 Docker容器中,只要资源在 src/main/resources/my_directory/ 下,即可正确定位;
  • ✅ 路径安全:避免手写路径导致的斜杠差异(/ vs \)、层级错位或拼写错误;
  • ✅ 显式校验:对 getResource() 结果和 File 状态做双重检查,提前失败,便于调试。

⚠️ 重要注意事项:

  • getResource().getPath() 仅适用于 file: 协议(即应用未打包或解压运行)。若需支持JAR内资源读取(jar: 协议),应改用 getResourceAsStream() + JarFile 解析,或使用 Paths.get(resourceUrl.toURI())(需JDK7+且对JAR路径有额外处理);
  • 资源路径不要以 / 开头(如 "my_directory" ✅,"/my_directory" ❌),否则 ClassLoader.getResource() 会尝试从绝对路径查找,通常失败;
  • 建议优先使用 Thread.currentThread().getContextClassLoader() 而非 getClass().getClassLoader(),以兼容SPI、模块化或框架代理场景。

总结:永远信任类路径,而非文件系统路径。将资源视为“逻辑位置”而非“物理地址”,是构建可移植Java应用的核心实践之一。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10537

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7682

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6692

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1144

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

928

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1376

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2769

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20091

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1235

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习