Android中Assets目录JSON文件修改后无法写入问题求助
问题原因及解决方案
核心问题
- Assets目录只读限制
Assets是应用安装包的内置目录,属于只读区域,系统不允许对该目录下的文件进行写入或修改操作,所有直接写入assets的尝试都会失败。 - 数据结构错误
你的代码仅将修改后的单个JSONObject写入文件,而非修改整个JSONArray后再写入,这会导致文件内容被替换为单个对象,破坏原本的数组结构,即使写入成功也不符合预期。
正确处理方案
需要将assets中的文件复制到应用的私有可读写存储目录(如filesDir),后续的修改和读取都基于这个副本操作:
1. 先复制assets文件到私有目录
private fun copyAssetToPrivateDir() { val targetFile = File(filesDir, "stempel.json") // 如果文件已存在,无需重复复制 if (targetFile.exists()) return try { assets.open("stempel.json").use { inputStream -> FileOutputStream(targetFile).use { outputStream -> inputStream.copyTo(outputStream) } } } catch (e: IOException) { e.printStackTrace() } }
2. 修改并写入完整的JSON数组
fun edit_json(pos: Int) { // 确保可读写的副本已存在 copyAssetToPrivateDir() val targetFile = File(filesDir, "stempel.json") try { // 读取私有目录中的文件 val jsonContent = targetFile.bufferedReader().use { it.readText() } val jsonArr = JSONArray(jsonContent) // 修改指定位置的对象 val targetObj = jsonArr.getJSONObject(pos) targetObj.put("sammelstatus", 1) // 将完整的JSON数组写入文件 val updatedJson = jsonArr.toString() FileOutputStream(targetFile).use { outputStream -> outputStream.write(updatedJson.toByteArray()) } } catch (e: IOException) { e.printStackTrace() } }
说明
- 应用私有存储目录(
filesDir)是系统分配的可读写区域,允许修改文件内容。 - 保留完整的
JSONArray结构,确保文件格式与原数据一致,不会丢失其他数组元素。 - 首次运行时自动从assets复制文件到私有目录,后续操作均基于这个可读写副本。
内容的提问来源于stack exchange,提问作者Kalle
相关产品推荐
相关产品推荐

