如何阅读kotlin中的纯文本文件?

问题描述 投票:1回答:3

在kotlin中可能有各种方法来读取纯文本文件。

我想知道可能的方式以及如何使用它们。

file kotlin text-files bufferedreader
3个回答
3
投票
  1. 使用BufferedReader import java.io.File import java.io.BufferedReader fun main(args: Array<String>) { val bufferedReader: BufferedReader = File("example.txt").bufferedReader() val inputString = bufferedReader.use { it.readText() } println(inputString) }
  2. 使用InputStream 逐行阅读 import java.io.File import java.io.InputStream fun main(args: Array<String>) { val inputStream: InputStream = File("example.txt").inputStream() val lineList = mutableListOf<String>() inputStream.bufferedReader().useLines { lines -> lines.forEach { lineList.add(it)} } lineList.forEach{println("> " + it)} } 阅读所有行 import java.io.File import java.io.InputStream fun main(args: Array<String>) { val inputStream: InputStream = File("example.txt").inputStream() val inputString = inputStream.bufferedReader().use { it.readText() } println(inputString) }
  3. 直接使用文件 import java.io.File import java.io.BufferedReader fun main(args: Array<String>) { val lineList = mutableListOf<String>() File("example.txt").useLines { lines -> lines.forEach { lineList.add(it) }} lineList.forEach { println("> " + it) } }

0
投票

Anisuzzaman的答案列出了几种可能性。

它们之间的主要区别在于文件是作为单个字符串读入内存,读入内存还是分成行,还是逐行读取。

显然,一次性将整个文件读入内存可能会占用更多内存,因此除非确实需要,否则应该避免这种情况。 (文本文件可以随意变大!)因此,与BufferedReader.useLines()逐行处理通常是一种很好的方法。

剩下的差异主要是历史性的。很早版本的Java使用InputStream&c,它没有正确区分字符和字节;加入Reader&c来纠正这个问题。 Java 8增加了使用流(例如Files.lines())更有效地逐行读取的方法。最近,Kotlin增加了自己的扩展功能(例如BufferedReader.useLines()),使其更加简单。


0
投票

上面的答案都是基于Kotlin Java。这是一种用于读取文本文件的Kotlin Native方法:

val bufferLength = 64 * 1024
val buffer = allocArray<ByteVar>(bufferLength)

 for (i in 1..count) {
    val nextLine = fgets(buffer, bufferLength, file)?.toKString()
    if (nextLine == null || nextLine.isEmpty()) break

    val records = parseLine(nextLine, ',')
    val key = records[column]
    val current = keyValue[key] ?: 0
    keyValue[key] = current + 1
}


fun parseLine(line: String, separator: Char) : List<String> {
    val result = mutableListOf<String>()
    val builder = StringBuilder()
    var quotes = 0
    for (ch in line) {
        when {
            ch == '\"' -> {
                quotes++
                builder.append(ch)
            }
            (ch == '\n') || (ch ==  '\r') -> {}
            (ch == separator) && (quotes % 2 == 0) -> {
                result.add(builder.toString())
                builder.setLength(0)
            }
            else -> builder.append(ch)
        }
    }
    return result
}

见:https://github.com/JetBrains/kotlin-native/blob/master/samples/csvparser/src/csvParserMain/kotlin/CsvParser.kt

© www.soinside.com 2019 - 2024. All rights reserved.