Почему цикл Котлина (для) не работает правильно с org.slf4j.Logger? - PullRequest
0 голосов
/ 13 февраля 2019

В моем проекте Kotlin в папке src / resources / I есть файл pair_ids.txt.

Здесь код: Это файл свойств:

key=value

Количество всех строк 1389 .

Здесь код, который строка за строкой читает содержимое этого файла.

import org.slf4j.LoggerFactory
private val logger = LoggerFactory.getLogger("Exchange")

 private var allSymbolsIDsMap: Map<String, String> = mapOf()    
 val pairsIDs = getResourceAsText("/pairs_ids.txt")
 allSymbolsIDsMap = pairsIDs.split(",").associate {
 val (left, right) = it.split("=")
          left to right.toString()
 }
 logger.info("allSymbolsIDsMap_size = " + allSymbolsIDsMap.size)
 var countAllSymbolHandler = 0
 for ((key, value) in allSymbolsIDsMap) {
   countAllSymbolHandler++
   logger.info("countAllSymbolHandler = $countAllSymbolHandler")
}

private fun getResourceAsText(path: String): String {
    return object {}.javaClass.getResourceAsStream(path).bufferedReader().use { it.readText() }
}

Результат:

Запуск проекта:

allSymbolsIDsMap_size = 1389
Start project - "countAllSymbolHandler =" print 1113 times

Снова запустите проект:

allSymbolsIDsMap_size = 1389
"countAllSymbolHandler =" print 242 times

Если заменить logger.info на простой println, то успех сработает.Количество всегда 1389 .

Почему цикл (для) не работает корректно с logger ?

1 Ответ

0 голосов
/ 13 февраля 2019

Попробуйте:

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

При воспроизведении потоков ввода / вывода используйте методы расширения use Kotlin и выполняйте всю обработку внутри блока use.

Это будет обрабатывать все открытия и закрытия потоков, чтобы не было утечек или забыть закрыть / очистить и т. Д.

...