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