Почему бы не прочитать все строки из текстового файла? - PullRequest
0 голосов
/ 13 февраля 2019

В моем проекте 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 голосов
/ 14 февраля 2019

Учитывая InputStream, вы можете использовать forEachLine, чтобы прочитать каждую строку отдельно:

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

Примечание: вы должны использовать useэто удобный способ убедиться, что поток закрыт после того, как чтение завершено (как уже предлагал user8159708).

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

В 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's.use методы расширения и выполняйте всю вашу обработку внутри блока use.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...