Kotlin чтение / импорт карты из txt.file - PullRequest
1 голос
/ 06 августа 2020

Я работаю над учебным проектом, который должен импортировать и экспортировать карточки Flashcards в файл txt.file, который позже предполагается использовать при опросе. исследование, которое я провел, на самом деле не работает, потому что я его не понимаю.

У меня есть общая карта, на которой я сохраняю термин: определение на карте

private var flashCardMap = mutableMapOf<String, String>()

Затем у меня есть эта функция экспорта

    private fun export() {
        println("File name:")
        scan.nextLine()
        val fileName = scan.nextLine()
        val myFile = File(fileName)
        try {
            myFile.bufferedWriter().use { out->
                flashCardMap.forEach {
                    out.write("${it.key}:${it.value}\n")
                } }
            println("${flashCardMap.size} cards have been saved.")
        } catch (e: FileNotFoundException) {
            println("File not Found.")
        }
    }

, которая экспортирует все карты, которые я определил ранее в txt. файл, подобный этому, с одной или несколькими Flashcard (Card = Definition)

key:value

И вот где я застрял. Я пытаюсь импортировать файл .txt и включенную карту, но это не работает. Предполагается импортировать карту и сообщить мне, сколько карт было импортировано, и добавить их в мою текущую карту flashcard, с которой я работаю в этом сеансе. Вот что я пробовал:

    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.")
        }
    }

1 Ответ

0 голосов
/ 19 августа 2020

На самом деле существует так много способов сериализации структурированных данных в файл, но поскольку в вашем примере используется формат key:value, разделенный символами новой строки, мы будем придерживаться этого.

Этот класс должен подойти твои нужды. Но это довольно просто c и в нем отсутствует какая-либо обработка ошибок.

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
    }
}

Если вы хотите использовать зрелый формат, встроенный java.util.Properties класс может упростить задачу. Единственная проблема заключается в том, что по умолчанию используется разделитель =, но предполагается, что он также может читать разделитель :.

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()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...