Kotlin写入Assets目录mcdata下JSON文件时遇文件未找到异常
Android Assets目录文件写入解决方案
Assets目录是APK打包时包含的只读资源目录,无法直接对其中的文件执行写入操作——这就是你调用FileOutputStream时报错的原因,而assets.open()是只读操作所以可以正常执行。要修改这类文件,需要先将其复制到应用的可写存储目录,再进行编辑。
实现步骤与代码示例
复制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 }写入修改后的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() } }调用示例
当你需要写入新的JSONObject时,先将其转为字符串,再调用上述函数:val newJson = JSONObject().apply { put("key", "new value") put("count", 100) } writeToWritableFile("your_file.json", newJson.toString())
注意事项
- 如果需要让其他应用访问修改后的文件,可以选择外部存储目录(需申请存储权限),但内部存储的
files目录更安全,无需额外权限。 - 后续读取修改后的文件时,直接从这个可写路径读取即可,不要再从Assets目录读取。
内容的提问来源于stack exchange,提问作者SHIDHIN TS
相关产品推荐
相关产品推荐

