Kotlin如何读取含字体元数据的文本文件并将各字符存入列表
实现思路
你可以用逐行遍历+动态读取的方式处理,不需要依赖固定分块的方法,核心逻辑是利用每个字符自带的高度元数据做读取:
- 第一步先预处理读入的所有行,跳过第一行文件头,不用提前过滤空行或分隔线,遍历过程中直接跳过即可
- 维护一个遍历下标,每次先找到当前位置第一个有效元数据行(非空、不是分隔线),拆分得到目标字符和对应的点阵行数n
- 从元数据行的下一行开始,连续取n行作为该字符的点阵内容,存入Map或自定义结构中
- 把下标移动到「元数据行位置 + 1 + n」的位置,重复上述流程直到攒够52个字符
代码示例
import java.io.File fun main() { val allLines = File("roman.txt").readLines() // 跳过第一行文件头,下标从1开始 var currentIndex = 1 // 用Map存储,可直接通过字符取对应点阵,也可以用List按顺序存储52个字符 val fontStorage = mutableMapOf<Char, List<String>>() while (currentIndex < allLines.size && fontStorage.size < 52) { val line = allLines[currentIndex].trim() // 跳过空行、大小写分隔的+线 if (line.isEmpty() || line.all { it == '+' }) { currentIndex++ continue } // 解析元数据:<字符> <点阵高度> val (charStr, heightStr) = line.split(" ") val targetChar = charStr.first() val height = heightStr.toInt() // 读取对应行数的点阵 val bitmapLines = allLines.subList(currentIndex + 1, currentIndex + 1 + height) fontStorage[targetChar] = bitmapLines // 移动下标到下一个字符的起始位置 currentIndex += 1 + height } // 测试:打印字符a的点阵 fontStorage['a']?.forEach(::println) }
这种方式完全适配不同高度的字符,也不用处理不同字符之间的空行分隔,健壮性更高。
内容的提问来源于stack exchange,提问作者Saher Al-Sous
相关产品推荐
相关产品推荐

