在我的Kotlin项目文件夹src/resources/
中,我有文件pairs_ids.txt
。
这是一个属性文件:
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 ?
答案 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所建议的那样)。