讲师中心 微信公众号
AI工具推荐 视频效率加速

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

秋丽同学_1078

秋丽同学_1078

发布时间:2026-03-25 14:31:03

|

404人浏览过

|

来源于php中文网

原创

如何在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 构造器识别的本地路径(仅适用于文件系统协议,见注意事项)。

以下是推荐实现:

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());
        }
    }
}

✅ 关键优势:

JavaStoryDevelop
JavaStoryDevelop

你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在

下载

立即学习“Java免费学习笔记(深入)”;

  • ✅ 环境无关:无论运行在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应用的核心实践之一。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
java
java

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

10797

2023.06.15

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

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

7922

2023.07.05

java自学难吗
java自学难吗

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

6892

2023.07.31

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

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

1164

2023.08.01

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

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

948

2023.08.02

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

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

1416

2023.08.02

java有什么用
java有什么用

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

2849

2023.08.02

java在线网站
java在线网站

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

20131

2023.08.03

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

80

2026.10.16

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn