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

Android项目中使用getResourceAsStream()读取JSON文件失败求助

解决Android项目中读取JSON资源文件的问题

我来帮你搞定这个读取JSON文件的问题~你遇到的getResourceAsStream()返回null的情况,主要是因为文件放错了位置,Android的资源加载规则和普通Java项目不太一样,下面给你详细说解决方案:

为什么之前的位置不对?

  • java目录下的文件:Android的构建系统只会把src/main/java下的.java文件当成源码编译,其他类型的文件(比如你的credentials.json)不会被打包到APK的可访问资源路径里,所以类加载器根本找不到它。
  • 直接放res根目录:res目录下的资源必须放在指定的子目录(比如raw、layout、drawable等),否则Gradle不会把它识别为可访问的资源,自然也读不到。

两种可行的解决方案

方案1:使用assets目录

assets目录是Android专门用来存放原生资源的地方,这里的文件不会被编译,可以直接按文件名读取:

  1. 在src/main目录下新建assets文件夹(如果没有的话),把credentials.json放进去,最终路径是src/main/assets/credentials.json。
  2. 修改你的静态方法,注意需要传入Context来获取AssetManager(静态方法本身没有Context,得从外部传进来):
private static InputStream getCredentials(Context context) throws IOException {
    AssetManager assetManager = context.getAssets();
    return assetManager.open("credentials.json");
}

调用的时候,比如在CalendarActivity的实例方法里:

try (InputStream in = getCredentials(this)) {
    // 执行你的JSON读取逻辑
} catch (IOException e) {
    e.printStackTrace();
}

方案2:使用res/raw目录

raw目录属于res资源目录的一部分,这里的文件会被生成对应的ID,通过R类访问:

  1. 在res目录下新建raw文件夹,把credentials.json放进去,最终路径是src/main/res/raw/credentials.json(注意文件名不能有大写字母或特殊符号,你的文件名没问题)。
  2. 同样需要传入Context来获取资源:
private static InputStream getCredentials(Context context) throws IOException {
    return context.getResources().openRawResource(R.raw.credentials);
}

两种方案的小区别

  • assets目录:支持任意文件结构(比如子文件夹),文件名限制更少,适合需要动态读取文件名或者文件层级复杂的场景。
  • res/raw目录:文件会被赋予唯一的资源ID,访问更安全,适合固定不变的资源,Android会自动处理资源的打包和访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:03:46