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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:36:08