You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kotlin/Android开发新手求助:如何创建并写入文本文件?

解决Android中无法写入assets文件夹文件的问题

嗨,作为Kotlin/Android新手踩这个坑太正常啦!咱们先弄明白为啥会报错,再一步步搞定它~

首先得明确:Android项目里的assets文件夹是只读的!APK安装后,这个目录里的文件是打包在APK包内的,系统根本不允许你往这里面写内容,所以你直接操作File("filename.txt")(指向assets里的文件)才会抛出FileNotFoundException: prices.txt (Read-only file system)这个错误。

那正确的做法是把文件写到App拥有写入权限的存储目录里,下面给你两种常用的方案:

方案一:写入App内部私有存储(推荐,无需权限)

内部存储是App专属的私密空间,其他App访问不到,而且不需要申请任何存储权限,非常适合存储App的私有数据。

步骤1(可选):如果需要基于assets里的原文件修改,先把它复制到内部存储

如果你是想修改assets里已有的filename.txt,得先把它复制到内部存储:

fun copyAssetsToInternal(context: Context, fileName: String) {
    val targetFile = File(context.filesDir, fileName)
    // 只有文件不存在时才复制,避免重复操作
    if (!targetFile.exists()) {
        context.assets.open(fileName).use { input ->
            FileOutputStream(targetFile).use { output ->
                input.copyTo(output)
            }
        }
    }
}

步骤2:写入内部存储的文件

不管是复制过来的文件还是新建文件,都可以这样写入内容:

// 获取内部存储的文件路径
val targetFile = File(context.filesDir, "filename.txt")
// 使用use自动关闭流,避免资源泄漏
targetFile.printWriter().use { out ->
    out.println("${it.key}, ${it.value}") // 这里的it如果是你的键值对对象,确保上下文正确哦
}

方案二:写入App外部私有存储(适合需要文件留存的场景)

如果你希望App卸载后文件还能保留,或者需要和其他授权的App共享文件,可以用外部存储的私有目录:

// 获取外部私有存储的文件路径
val targetFile = File(context.getExternalFilesDir(null), "filename.txt")
// 写入内容
targetFile.printWriter().use { out ->
    out.println("${it.key}, ${it.value}")
}

小贴士:Android 10及以上版本,访问这个外部私有目录不需要申请READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE权限;但低于Android 10的版本,需要在Manifest里添加权限,还要动态申请哦。

额外提醒

  • 永远别想着往assets、res这类打包在APK里的目录写内容,它们从设计上就是只读的。
  • 如果你的数据是结构化的(比如键值对、列表),其实用SharedPreferences或者Room数据库会比直接写文本文件更方便管理,后续读取和修改也更省心~

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

火山引擎 最新活动