Kotlin从txt.NET文件读取/导入地图

Kotlin从txt.NET文件读取/导入地图,kotlin,Kotlin,我正在做一个学习项目,该项目旨在将抽认卡导入并导出到一个txt.file文件中,该文件稍后将用于提问 目前,我被困在进口部分,我所做的研究没有真正起作用,因为我没有真正得到它 我有一张完整的地图,我把术语保存在地图中:定义 private var flashCardMap = mutableMapOf<String, String>() 它导出我前面在txt中定义的所有卡片。使用一个或多个Flashcard(Card=Definition)像这样的文件 这就是我被困的地方。我试图导

我正在做一个学习项目,该项目旨在将抽认卡导入并导出到一个txt.file文件中,该文件稍后将用于提问

目前,我被困在进口部分,我所做的研究没有真正起作用,因为我没有真正得到它

我有一张完整的地图,我把术语保存在地图中:定义

private var flashCardMap = mutableMapOf<String, String>()
它导出我前面在txt中定义的所有卡片。使用一个或多个Flashcard(Card=Definition)像这样的文件

这就是我被困的地方。我试图导入一个.txt文件和包含的映射,但它不起作用。它应该导入地图,并告诉我导入了多少张卡,然后将它们添加到我当前的flashcardmap中,我正在使用该会话。以下是我尝试过的:

    private fun import() {
        println("File name:")
        scan.nextLine()
        val fileName = scan.nextLine()
        val myFile = File("$fileName")
        try {
            val importMap =
            myFile.readLines().chunked(2) {
                it[0] to it[1]
            }.toMap()
            println("${importMap.size} cards have been loaded.")
            flashCardMap.putAll(importMap)
        } catch (e: FileNotFoundException) {
            println("File not Found.")
        }
    }

实际上有很多方法可以将结构化数据序列化到文件中,但是由于您的示例使用了
key:value
格式,并用新行分隔,因此我们将继续使用该格式

这门课应该适合你的需要。但是它非常简单,并且缺少任何类型的错误处理

class Serializer(private val filePath: Path, private val delimiter: String = ":") {

    fun export(data: Map<String, String>) {
        filePath.toFile().writer().use { writer ->
            for ((key, value) in data) {
                writer.write("$key$delimiter$value\n")
            }
        }
    }

    fun import(): Map<String, String> {
        val data = mutableMapOf<String, String>()

        filePath.toFile().reader().use { reader ->
            reader.forEachLine { line ->
                val (key, value) = line.split(delimiter)
                data[key] = value
            }
        }

        return data
    }
}

实际上有很多方法可以将结构化数据序列化到文件中,但是由于您的示例使用了
key:value
格式,并用新行分隔,因此我们将继续使用该格式

这门课应该适合你的需要。但是它非常简单,并且缺少任何类型的错误处理

class Serializer(private val filePath: Path, private val delimiter: String = ":") {

    fun export(data: Map<String, String>) {
        filePath.toFile().writer().use { writer ->
            for ((key, value) in data) {
                writer.write("$key$delimiter$value\n")
            }
        }
    }

    fun import(): Map<String, String> {
        val data = mutableMapOf<String, String>()

        filePath.toFile().reader().use { reader ->
            reader.forEachLine { line ->
                val (key, value) = line.split(delimiter)
                data[key] = value
            }
        }

        return data
    }
}

您遇到了什么样的问题?您是否收到异常,或者您是否只收到希望读取的数据的子集,或者其他内容?您希望该文件的格式是什么?一行中的所有内容(
key=value,key=value…
)?每个条目一行(
key=value
key=value
)?每个值一行(
)?还有别的吗现在,您的导出正在写入(几乎)其中一个,但您的导入正在尝试读取另一个。感谢您花时间。当我从文件导入时,它会得到一个空映射,没有键值对。我想要的是将带有键、值对(Flashcards)的my map导出为txt文件,然后导入完全相同的映射以再次在我的程序中使用,并将它们添加到flashCardMap。你明白我的意思吗?:)你还没有回答我的问题。(这样做应该会告诉你你的问题在哪里。)@gidds我没有想到这一点。我修改了导出函数(见上文),以便导出key:value\n。因此,每个键值对在一个新行中。现在,我的下一步是通过myFile.forEachLine导入,并以某种方式通过分隔符“:”分割每一对,并将键和值分配给我的导入映射。我只是不知道如何用代码来写你遇到了什么样的问题?您是否收到异常,或者您是否只收到希望读取的数据的子集,或者其他内容?您希望该文件的格式是什么?一行中的所有内容(
key=value,key=value…
)?每个条目一行(
key=value
key=value
)?每个值一行(
)?还有别的吗现在,您的导出正在写入(几乎)其中一个,但您的导入正在尝试读取另一个。感谢您花时间。当我从文件导入时,它会得到一个空映射,没有键值对。我想要的是将带有键、值对(Flashcards)的my map导出为txt文件,然后导入完全相同的映射以再次在我的程序中使用,并将它们添加到flashCardMap。你明白我的意思吗?:)你还没有回答我的问题。(这样做应该会告诉你你的问题在哪里。)@gidds我没有想到这一点。我修改了导出函数(见上文),以便导出key:value\n。因此,每个键值对在一个新行中。现在,我的下一步是通过myFile.forEachLine导入,并以某种方式通过分隔符“:”分割每一对,并将键和值分配给我的导入映射。我只是不知道如何用代码来写
class Serializer(private val filePath: Path, private val delimiter: String = ":") {

    fun export(data: Map<String, String>) {
        filePath.toFile().writer().use { writer ->
            for ((key, value) in data) {
                writer.write("$key$delimiter$value\n")
            }
        }
    }

    fun import(): Map<String, String> {
        val data = mutableMapOf<String, String>()

        filePath.toFile().reader().use { reader ->
            reader.forEachLine { line ->
                val (key, value) = line.split(delimiter)
                data[key] = value
            }
        }

        return data
    }
}
class PropertiesSerializer(private val filePath: Path) {

    fun export(data: Map<String, String>) {
        val props = Properties()

        for ((key, value) in data) {
            props[key] = value
        }

        filePath.toFile().outputStream().use { stream ->
            props.store(stream, null)
        }
    }

    fun import(): Map<String, String> {
        val props = Properties()

        filePath.toFile().inputStream().use { stream ->
            props.load(stream)
        }

        return props
                .map { (key, value) -> key.toString() to value.toString() }
                .toMap()
    }
}