为什么不从文本文件中读取所有行?

时间:2019-02-13 13:26:08

标签: kotlin

在我的Kotlin项目文件夹src/resources/中,我有文件pairs_ids.txt

enter image description here

这是一个属性文件:

key=value

所有行数均为 1389

这里的代码逐行读取该文件的内容。

open class AppStarter : Application<AppConfig>() {
    override fun getName() = "stats"

    override fun run(configuration: AppConfig?, environment: Environment?) {
        val logger = LoggerFactory.getLogger(this::class.java)

        val inputStream = javaClass.getResourceAsStream("/pairs_ids.txt")
        val isr = InputStreamReader(inputStream)
        val br = BufferedReader(isr)
        for (line in br.lines()) {
            logger.info("current_line = " + line)
        }
        br.close()
        isr.close()
        inputStream.close()
    }
}

fun main(args: Array<String>) {
    AppStarter().run(*args)
}

问题在于 current_line 的计数每次都不同。

开始项目- current_line 的数量为 803

重新开始项目- current_line 的数量为 1140

为什么每次计数都不相同且不等于 1389

2 个答案:

答案 0 :(得分:0)

Kotlin具有一些出色的扩展方法,可以轻松处理流,阅读行和文本等。

尝试一下:

open class AppStarter : Application<AppConfig>() {
    override fun getName() = "stats"

    override fun run(configuration: AppConfig?, environment: Environment?) {
        val logger = LoggerFactory.getLogger(this::class.java)
        javaClass.getResourceAsStream("/pairs_ids.txt").bufferedReader().use { reader -> reader.readLines() }.forEach { line -> logger.info(line) }
    }
}

fun main(args: Array<String>) {
    AppStarter().run(*args)
}

在使用输入/输出流时,请使用Kotlin的use扩展方法,并在use块内进行所有处理。

这将处理所有打开和关闭流的操作,以确保没有泄漏或忘记关闭/冲洗等。

答案 1 :(得分:0)

给出一个InputStream,您可以使用forEachLine分别读取每一行:

inputStream.bufferedReader().use {
    it.forEachLine {
        println(it)
    }
}

注意:您应该使用use,这是一种确保读取完成后关闭流的便捷方法(如user8159708所建议的那样)。