Android Studio读取compliments.json时触发FileNotFoundException
解决Android Studio中读取JSON文件的FileNotFoundException问题
嘿,我之前也踩过完全一样的坑!你遇到的java.io.FileNotFoundException核心原因是JSON文件放错了目录,且用了不符合Android资源规则的读取方式——res根目录根本不是用来存放这类可直接读取的原始文件的,系统不会把这里的文件识别为可访问资源,所以无论清缓存、换读取方法都没用。
正确的两种解决方案:
方案1:使用Assets目录(推荐,适合多文件或需动态指定文件名的场景)
- 在
app/src/main目录下新建一个名为assets的文件夹(和res同级,注意拼写全小写) - 把
compliments.json直接放进这个assets文件夹 - 通过
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引用)
- 在
res目录下新建一个名为raw的文件夹(全小写) - 把
compliments.json放进raw文件夹,注意文件名只能用小写字母、数字和下划线,不能有大写或特殊字符 - 通过
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
相关产品推荐
相关产品推荐

