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

Java获取目录下JSON文件名后如何读取内容并转换为对象

实现方法

你已经拿到了/data目录下的文件名列表,只需要给每个文件名拼接/data/前缀得到单个JSON文件的classpath路径,再通过getResourceAsStream获取对应文件的输入流,即可读取文件内容、完成JSON转对象操作。

先修正你原代码的两个问题:

  • 变量名笔误:定义的BufferedReader变量名是b,调用lines()时写的是bufferedReader,运行会报变量不存在
  • 读取流未指定字符集,遇到中文会乱码,固定使用UTF-8即可

完整可运行代码如下(以常用的Jackson JSON解析库为例):

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.stream.Collectors;

public class MyClass {
    // JSON解析工具全局单例复用,避免重复创建开销
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    // 目标实体类,字段和JSON属性对应即可,需提供无参构造、getter、setter
    public static class JsonBizData {
        private Integer id;
        private String content;

        public JsonBizData() {}
        public Integer getId() {return id;}
        public void setId(Integer id) {this.id = id;}
        public String getContent() {return content;}
        public void setContent(String content) {this.content = content;}
    }

    public static void main(String[] args) throws Exception {
        List<String> jsonFileNames;
        // 自动关闭流,避免资源泄漏
        try (InputStream dirIs = MyClass.class.getResourceAsStream("/data");
             InputStreamReader dirReader = new InputStreamReader(dirIs, StandardCharsets.UTF_8);
             BufferedReader dirBufferedReader = new BufferedReader(dirReader)) {
            jsonFileNames = dirBufferedReader.lines()
                    // 过滤非json后缀的文件、子目录、系统隐藏文件
                    .filter(name -> name.endsWith(".json"))
                    .collect(Collectors.toList());
        }

        // 遍历读取每个JSON文件
        for (String fileName : jsonFileNames) {
            String singleFilePath = "/data/" + fileName;
            try (InputStream jsonIs = MyClass.class.getResourceAsStream(singleFilePath)) {
                // 直接转成目标实体对象
                JsonBizData data = OBJECT_MAPPER.readValue(jsonIs, JsonBizData.class);
                System.out.printf("读取文件%s,解析结果:id=%d,content=%s%n", fileName, data.getId(), data.getContent());

                // 如果不需要转对象,只想获取原始JSON字符串,用下面的写法
                // String jsonRaw = new String(jsonIs.readAllBytes(), StandardCharsets.UTF_8);
                // System.out.printf("文件%s原始内容:%s%n", fileName, jsonRaw);
            }
        }
    }
}

注意事项

  • 目录位置要求:data文件夹必须在classpath根目录下。如果是Maven/Gradle项目,放在src/main/resources目录下即可;如果是普通Java项目,放在src根目录下,确保编译后data目录和class文件在同一输出根路径。
  • 不要用java.io.File读取classpath下的资源:本地IDE运行时可能正常,但项目打包成可执行jar后,资源被压缩在jar包内部,文件系统不存在对应实体文件,会抛出FileNotFoundException,必须通过流的方式读取才能兼容所有部署场景。
  • JSON解析库可按需替换:示例用的是Spring生态默认集成的Jackson,换成Fastjson2、Gson逻辑完全一致,只需把单个文件的流传入对应解析方法即可。
  • 不要省略文件后缀过滤:读取目录得到的列表可能包含子目录、系统生成的隐藏文件(比如macOS下的.DS_Store),不加过滤会触发解析报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:36:13