Как прочитать простой текстовый файл в kotlin? - PullRequest
1 голос
/ 15 марта 2019

Для чтения простого текстового файла в kotlin могут использоваться различные способы.

Я хочу знать, каковы возможные способы и как я могу их использовать.

Ответы [ 3 ]

3 голосов
/ 15 марта 2019
  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 голосов
/ 15 марта 2019

Все приведенные выше ответы основаны на Kotlin Java. Вот родной способ чтения текстовых файлов Kotlin:

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

0 голосов
/ 15 марта 2019

Ответ Anisuzzaman перечисляет несколько возможностей.

Основные различия между ними заключаются в том, читается ли файл в память как одна строка, читается в память и разбивается на строки, или читается построчно.

Очевидно, что чтение всего файла в память за один раз может занять намного больше памяти, так что этого следует избегать, если в этом нет особой необходимости. (Текстовые файлы могут быть произвольно большими!) Поэтому обработка строки за строкой с BufferedReader.useLines() часто является хорошим подходом.

Остальные различия в основном исторические. В самых ранних версиях Java использовался InputStream & c, который неправильно различал символы и байты; Reader & c были добавлены, чтобы исправить это. В Java 8 добавлены способы более эффективного чтения построчно с использованием потоков (например, Files.lines()). И совсем недавно, Kotlin добавил свои собственные функции расширения (например, BufferedReader.useLines()), которые делают его еще проще.

...