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

Kotlin写入Assets目录mcdata下JSON文件时遇文件未找到异常

Android Assets目录文件写入解决方案

Assets目录是APK打包时包含的只读资源目录,无法直接对其中的文件执行写入操作——这就是你调用FileOutputStream时报错的原因,而assets.open()是只读操作所以可以正常执行。要修改这类文件,需要先将其复制到应用的可写存储目录,再进行编辑。

实现步骤与代码示例

  1. 复制Assets文件到可写目录
    先编写一个函数,将目标JSON文件从Assets复制到应用内部存储的files目录(这个目录是应用私有的可写路径):

    private fun copyAssetToWritableDir(fileName: String): String {
        val targetFile = File(filesDir, "mcdata/$fileName")
        // 确保目标目录存在
        targetFile.parentFile?.mkdirs()
    
        if (!targetFile.exists()) {
            assets.open("mcdata/$fileName").use { inputStream ->
                FileOutputStream(targetFile).use { outputStream ->
                    inputStream.copyTo(outputStream)
                }
            }
        }
        return targetFile.absolutePath
    }
    
  2. 写入修改后的JSON数据
    接下来编写写入函数,先获取可写路径的文件,再写入新的JSON内容:

    fun writeToWritableFile(fileName: String, jsonContent: String) {
        try {
            val filePath = copyAssetToWritableDir(fileName)
            FileOutputStream(filePath).use { outputStream ->
                OutputStreamWriter(outputStream).use { writer ->
                    writer.write(jsonContent)
                }
            }
        } catch (e: Exception) {
            "Exception: ${e.message}".toLog()
        }
    }
    
  3. 调用示例
    当你需要写入新的JSONObject时,先将其转为字符串,再调用上述函数:

    val newJson = JSONObject().apply {
        put("key", "new value")
        put("count", 100)
    }
    writeToWritableFile("your_file.json", newJson.toString())
    

注意事项

  • 如果需要让其他应用访问修改后的文件,可以选择外部存储目录(需申请存储权限),但内部存储的files目录更安全,无需额外权限。
  • 后续读取修改后的文件时,直接从这个可写路径读取即可,不要再从Assets目录读取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 15:42:07