Kotlin Android项目中无法读取JSON文件的问题求助
解决Android环境中读取JSON文件的"FileNotFoundException"问题
问题根源分析
你的两段代码在Android环境失效的原因分别是:
- 本地Windows路径无法在Android使用:
Android基于Linux内核,设备中不存在C:/Users/admin/Document/sample.json这类Windows文件路径,直接用该路径必然找不到文件。 - Assets目录路径错误:
Assets目录的文件访问路径是相对于src/main/assets根目录的,../res/sample.json这种相对路径无效——res和assets是APK中平级的资源目录,无法通过assets的open()方法跨目录访问res文件。
正确解决方案
方案1:读取Assets目录中的JSON文件
- 确保
sample.json放在Android项目的src/main/assets目录下(如果没有assets文件夹,手动创建)。 - 使用以下代码读取:
val jsonString = applicationContext.assets.open("sample.json") .bufferedReader() .use { it.readText() } println(jsonString)
方案2:读取外部存储中的JSON文件
如果你的JSON文件在设备外部存储中,注意Android版本的存储权限差异:
- Android 10及以上:
requestLegacyExternalStorage仅在Android 10有效,Android 11+已废弃。推荐使用应用私有外部存储(无需额外权限):val externalFilesDir = applicationContext.getExternalFilesDir(null) val jsonFile = File(externalFilesDir, "sample.json") if (jsonFile.exists()) { val jsonString = jsonFile.readText() println(jsonString) } else { // 处理文件不存在的情况 } - 若需访问公共外部存储的文件,需使用**存储访问框架(SAF)**让用户手动选择文件,或者针对媒体文件使用MediaStore API。
补充:读取res/raw目录的JSON文件
如果把JSON放在res/raw目录下(需创建raw文件夹),可以用资源ID读取:
val inputStream = resources.openRawResource(R.raw.sample) val jsonString = inputStream.bufferedReader().use { it.readText() } println(jsonString)
内容的提问来源于stack exchange,提问作者Arafin
相关产品推荐
相关产品推荐

