如何在Kotlin中读取纯文本文件?

时间:2019-03-15 12:25:39

标签: file kotlin text-files bufferedreader

在Kotlin中可能有多种读取纯文本文件的方法。

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

5 个答案:

答案 0 :(得分:7)

我认为最简单的编码方式是使用 kotlin.text 和 java.io.File

import java.io.File

fun main(args: Array<String>) {
    val text = File("sample.txt").readText()
    println(text)
}

答案 1 :(得分:2)

要读取文本文件,必须首先创建它。在Android Studio中,您将像这样创建文本文件:

1)从垂直工具栏的顶部选择“项目”以打开项目“工具窗口” 2)从“工具窗口”顶部的下拉菜单中,选择“ Android” 3)右键点击“应用”,然后选择“新建” 然后->“文件夹”(旁边带有绿色Android图标的文件夹) 然后->“资产文件夹” 4)在“工具”窗口中出现后,右键单击“资产”文件夹 5)选择“新建”->“文件” 6)命名文件,如果是文本文件,则包含扩展名“ .txt”;如果用于WebView,则包含扩展名“ .html” 7)编辑文件或将文本剪切并粘贴到其中。现在,该文件将显示在“工具窗口”中“项目”文件下,您可以随时双击以对其进行编辑。

要访问此文件,请使用前缀“ application.assets”。其次是someFunction(fileName)。例如(在Kotlin中):

val fileName = "townNames.txt"
val inputString = application.assets.open(fileName).bufferedReader().use { it.readText() }
val townList: List<String> = inputString.split("\n")

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

它们之间的主要区别在于文件是作为单个String读取到内存中,还是被读取到内存中并分成几行,或者逐行读取。

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

其余差异主要是历史性的。 Java的早期版本使用InputStream&c,它不能正确地区分字符和字节。添加了Reader&c来更正此问题。 Java 8添加了使用流(例如Files.lines())更有效地逐行读取的方式。最近,Kotlin添加了自己的扩展功能(例如BufferedReader.useLines()),使其更加简单。

答案 4 :(得分:0)

以上所有答案均基于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