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_STORAGE或WRITE_EXTERNAL_STORAGE权限;但低于Android 10的版本,需要在Manifest里添加权限,还要动态申请哦。
额外提醒
- 永远别想着往assets、res这类打包在APK里的目录写内容,它们从设计上就是只读的。
- 如果你的数据是结构化的(比如键值对、列表),其实用SharedPreferences或者Room数据库会比直接写文本文件更方便管理,后续读取和修改也更省心~
内容的提问来源于stack exchange,提问作者mattp341




