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

Android Studio读取compliments.json时触发FileNotFoundException

解决Android Studio中读取JSON文件的FileNotFoundException问题

嘿,我之前也踩过完全一样的坑!你遇到的java.io.FileNotFoundException核心原因是JSON文件放错了目录,且用了不符合Android资源规则的读取方式——res根目录根本不是用来存放这类可直接读取的原始文件的,系统不会把这里的文件识别为可访问资源,所以无论清缓存、换读取方法都没用。

正确的两种解决方案:

方案1:使用Assets目录(推荐,适合多文件或需动态指定文件名的场景)

  1. 在app/src/main目录下新建一个名为assets的文件夹(和res同级,注意拼写全小写)
  2. 把compliments.json直接放进这个assets文件夹
  3. 通过AssetManager读取文件,示例代码如下:
// Activity中直接用this.getAssets(),Fragment中用getContext().getAssets()
try {
    AssetManager assetManager = getAssets();
    InputStream inputStream = assetManager.open("compliments.json");
    
    // 将输入流转换为JSON字符串
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    StringBuilder jsonContent = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null) {
        jsonContent.append(line);
    }
    String jsonString = jsonContent.toString();
    
    // 用你熟悉的JSON解析库(Gson/Moshi/Jackson)转成对象列表
    // 比如Gson写法:
    // List<YourComplimentModel> compliments = new Gson().fromJson(
    //     jsonString,
    //     new TypeToken<List<YourComplimentModel>>(){}.getType()
    // );
    
    inputStream.close();
} catch (IOException e) {
    e.printStackTrace();
}

方案2:使用Raw资源目录(适合单个固定文件,可通过资源ID引用)

  1. 在res目录下新建一个名为raw的文件夹(全小写)
  2. 把compliments.json放进raw文件夹,注意文件名只能用小写字母、数字和下划线,不能有大写或特殊字符
  3. 通过Resources类读取,示例代码:
try {
    InputStream inputStream = getResources().openRawResource(R.raw.compliments);
    
    // 同样转换为JSON字符串并解析
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    StringBuilder jsonContent = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null) {
        jsonContent.append(line);
    }
    String jsonString = jsonContent.toString();
    
    // 后续解析逻辑同上
    
    inputStream.close();
} catch (IOException e) {
    e.printStackTrace();
}

为什么你之前的尝试无效?

Android打包APK时,res根目录的文件不会被识别为合法资源,既不会被加入资源索引,也不会原封不动打包进APK——所以你用普通的File路径去读取,系统根本找不到这个文件。而assets和raw目录下的文件会被完整打包,并且Android提供了专门的API来访问它们。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:31:51