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

Kotlin中FileWriter无法创建文件问题求助

问题分析与解决方案

你遇到的问题核心是Android文件系统的权限与路径限制:直接使用FileWriter("data.json")会尝试写入设备的根目录,但普通Android应用没有根目录的写入权限,因此抛出IOException,导致文件创建失败,Logcat才会输出"not fn"。

下面是具体的修复方案,分两种常见场景:

方案1:写入应用私有内部存储(推荐)

应用的私有内部存储目录只有你的应用能访问,不需要额外权限,卸载应用时文件会被自动删除,适合保存应用专属数据。

修改代码中的FileWriter初始化部分,使用Context提供的filesDir获取正确的路径:

// 注意:需要传入Context,比如在Activity中直接用this,在ViewModel中需要通过构造函数传入Context
fun writeJson(context: Context) {
    val item1 = InterItem(1, DateT(2018, Calendar.FEBRUARY, 6).date, "Dina", "type1")
    val item2 = InterItem(2, DateT(2018, Calendar.MARCH, 8).date, "Lili", "type2")
    val item3= InterItem(3, DateT(2018, Calendar.MAY, 10).date, "Wassim", "type3")
    val res = ListInter()
    res.list= arrayListOf( item1, item2, item3)
    val gson = GsonBuilder().setPrettyPrinting().create()
    val strJson = gson.toJson(res)

    // 使用应用私有内部目录路径
    val jsonFile = File(context.filesDir, "data.json")
    try {
        FileWriter(jsonFile).use { writer ->
            writer.write(strJson)
        }
        Log.d("success", "文件写入成功,路径:${jsonFile.absolutePath}")
    } catch (e: IOException) {
        // 打印具体错误信息,方便排查
        e.printStackTrace()
        Log.e("errr","写入失败:${e.message}")
    }
}

这里用了Kotlin的use函数,它会自动关闭流,不需要手动在finally里处理,更简洁安全。

方案2:写入外部存储(如果需要共享文件)

如果需要文件能被其他应用访问,或者想保存到外部存储(比如SD卡),需要注意Android的分区存储规则:

  • 对于Android 10+(API 29+),推荐写入应用专属外部目录(不需要权限),路径通过context.getExternalFilesDir(null)获取,卸载应用时文件会被删除。
  • 如果要写入公共目录(比如Downloads),需要动态申请WRITE_EXTERNAL_STORAGE权限(Android 10+还需要额外处理MediaStore)。

示例代码(应用专属外部目录):

fun writeJsonToExternal(context: Context) {
    // 其他逻辑和方案1一致...
    val strJson = gson.toJson(res)

    val externalDir = context.getExternalFilesDir(null)
    val jsonFile = File(externalDir, "data.json")
    try {
        FileWriter(jsonFile).use { writer ->
            writer.write(strJson)
        }
        Log.d("success", "外部存储写入成功,路径:${jsonFile.absolutePath}")
    } catch (e: IOException) {
        e.printStackTrace()
        Log.e("errr","外部存储写入失败:${e.message}")
    }
}

额外建议

  • 优化错误日志:把Log.e("errr","not fn")改成Log.e("errr","写入失败:${e.message}"),这样能看到具体的错误原因(比如权限被拒、路径不存在等),方便快速排查。
  • 检查权限:如果写入公共外部目录,记得在AndroidManifest.xml中声明权限,并在运行时动态申请(Android 6.0+)。

内容的提问来源于stack exchange,提问作者DINA TAKLIT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:34:08