diff --git a/libraries/stdlib/src/kotlin/io/FileReadWrite.kt b/libraries/stdlib/src/kotlin/io/FileReadWrite.kt index 9639923f5b7..fd4066a633b 100644 --- a/libraries/stdlib/src/kotlin/io/FileReadWrite.kt +++ b/libraries/stdlib/src/kotlin/io/FileReadWrite.kt @@ -207,11 +207,11 @@ public fun File.outputStream(): FileOutputStream { } /** - * Reads the file content as a list of lines. By default uses UTF-8 charset. + * Reads the file content as a list of lines. * * Do not use this function for huge files. * - * @param charset character set to use. + * @param charset character set to use. By default uses UTF-8 charset. * @return list of file lines. */ public fun File.readLines(charset: Charset = Charsets.UTF_8): List { @@ -220,3 +220,12 @@ public fun File.readLines(charset: Charset = Charsets.UTF_8): List { return result } +/** + * Calls the [block] callback giving it a sequence of all the lines in this file and closes the reader once + * the processing is complete. + + * @param charset character set to use. By default uses UTF-8 charset. + * @return the value returned by [block]. + */ +public inline fun File.useLines(charset: Charset = Charsets.UTF_8, block: (Sequence) -> T): T = + bufferedReader(charset).use { block(it.lineSequence()) } diff --git a/libraries/stdlib/src/kotlin/io/ReadWrite.kt b/libraries/stdlib/src/kotlin/io/ReadWrite.kt index 170f3e659e9..cc667e6dcf5 100644 --- a/libraries/stdlib/src/kotlin/io/ReadWrite.kt +++ b/libraries/stdlib/src/kotlin/io/ReadWrite.kt @@ -24,6 +24,17 @@ public fun Writer.buffered(bufferSize: Int = defaultBufferSize): BufferedWriter */ public fun Reader.forEachLine(block: (String) -> Unit): Unit = useLines { it.forEach(block) } +/** + * Reads this reader content as a list of lines. + * + * Do not use this function for huge files. + */ +public fun Reader.readLines(): List { + val result = arrayListOf() + forEachLine { result.add(it) } + return result +} + /** * Calls the [block] callback giving it a sequence of all the lines in this file and closes the reader once * the processing is complete. diff --git a/libraries/stdlib/test/io/ReadWrite.kt b/libraries/stdlib/test/io/ReadWrite.kt index a832d13e0a3..2cd09ebb14a 100644 --- a/libraries/stdlib/test/io/ReadWrite.kt +++ b/libraries/stdlib/test/io/ReadWrite.kt @@ -41,7 +41,14 @@ class ReadWriteTest { sample().forEachLine { list.add(it) } - assertEquals(arrayListOf("Hello", "World"), list) + assertEquals(listOf("Hello", "World"), list) + + assertEquals(listOf("Hello", "World"), sample().readLines()) + + sample().useLines { + assertEquals(listOf("Hello", "World"), it.toList()) + } + var reader = StringReader("") var c = 0 @@ -78,10 +85,17 @@ class ReadWriteTest { assertTrue(arr.contains('W'.toByte())) } val list = ArrayList() - file.forEachLine("UTF8", { + file.forEachLine(Charsets.UTF_8, { list.add(it) }) assertEquals(arrayListOf("Hello", "World"), list) + + assertEquals(arrayListOf("Hello", "World"), file.readLines()) + + file.useLines { + assertEquals(arrayListOf("Hello", "World"), it.toList()) + } + val text = file.inputStream().reader().readText() assertTrue(text.contains("Hello")) assertTrue(text.contains("World"))