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

Android中Assets目录JSON文件修改后无法写入问题求助

问题原因及解决方案

核心问题

  1. Assets目录只读限制
    Assets是应用安装包的内置目录,属于只读区域,系统不允许对该目录下的文件进行写入或修改操作,所有直接写入assets的尝试都会失败。
  2. 数据结构错误
    你的代码仅将修改后的单个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 11:05:04