Android Kotlin 如何从文本文件读取单词数据,实现按钮每点击一次读取下一行内容
实现点击按钮逐行读取文本单词的方案
核心逻辑说明
实现该功能的核心是避免每次按钮点击都重复打开文件从头读取,需要把文件内容提前加载到内存,同时维护一个记录当前读取位置的游标,每次点击时移动游标取下一行内容即可。
具体实现步骤
- 第一步:准备单词文件
最常用的存放位置是app的assets目录,新建名为words.txt的文本文件,每一行单独存储一个单词,保证文件编码为UTF-8,避免读取乱码。 - 第二步:在页面组件(Activity/Fragment)中声明全局状态变量
用来缓存加载好的全部单词、记录当前读取到的位置索引:// 缓存全部单词的列表 private lateinit var wordList: List<String> // 当前读取位置的索引,初始值-1代表尚未开始读取 private var currentLineIndex = -1 - 第三步:在页面初始化阶段一次性加载全量文件内容
选择在页面生命周期的初始化节点(比如onCreate方法中)完成文件读取,不要放在按钮点击回调里,减少重复IO带来的卡顿:// 从assets目录加载单词文件,use块会自动关闭文件流,避免内存泄漏 wordList = application.assets.open("words.txt").bufferedReader().use { bufferReader -> bufferReader.readLines() } - 第四步:给按钮绑定点击逻辑,实现逐行读取
每次点击时把读取索引向后移动一位,取出对应行的单词做展示,同时做好边界判断,避免越界崩溃:nextWordBtn.setOnClickListener { // 读取索引向后移动 currentLineIndex += 1 // 边界判断:如果已经读到文件最后一行,按业务需求做兜底处理 if (currentLineIndex >= wordList.size) { // 可选逻辑:循环回到文件开头重新读取,或者弹出“没有更多单词”的提示 currentLineIndex = 0 } // 取出当前行的单词,展示到界面组件上 val targetWord = wordList[currentLineIndex] wordShowTv.text = targetWord }
常见问题提醒
- 绝对不要把打开文件、读取全量内容的逻辑写在按钮点击回调里,否则每次点击都会重置文件读取位置,永远只能读到文件第一行的内容,还会因为频繁文件IO造成界面卡顿。
- 必须加索引的边界判断,否则读到文件末尾继续点击时,会抛出数组越界的运行时崩溃。
- 如果单词文件体量极大(比如十万行以上,占用内存超过10MB),不建议一次性全量加载到内存,可以使用
RandomAccessFile记录上次读取到的文件字节偏移位置,每次点击时从偏移位置开始读取下一行,再更新偏移量,降低内存占用。
内容的提问来源于stack exchange,提问作者marcin
相关产品推荐
相关产品推荐

