Nuestro equipo de expertos luego de varios días de investigación y recopilación de de datos, hemos dado con la solución, queremos que te resulte útil en tu trabajo.
Solución:
Kotlin tiene extensiones específicas solo para este propósito.
Lo más simple:
val inputAsString = input.bufferedReader().use it.readText() // defaults to UTF-8
Y en este ejemplo podrías decidir entre bufferedReader()
o solo reader()
. La llamada a la función. Closeable.use()
cerrará automáticamente la entrada al final de la ejecución de la lambda.
Otras lecturas:
Si haces mucho este tipo de cosas, podrías escribir esto como una función de extensión:
fun InputStream.readTextAndClose(charset: Charset = Charsets.UTF_8): String
return this.bufferedReader(charset).use it.readText()
Que luego podría llamar fácilmente como:
val inputAsString = input.readTextAndClose() // defaults to UTF-8
Como nota al margen, todas las funciones de extensión de Kotlin que requieren conocer el charset
ya por defecto UTF-8
por lo que si necesita una codificación diferente, debe ajustar el código anterior en las llamadas para incluir una codificación para reader(charset)
o bufferedReader(charset)
.
Advertencia: Es posible que vea ejemplos que son más cortos:
val inputAsString = input.reader().readText()
Pero estos no cierres la corriente. Asegúrese de consultar la documentación de la API para todas las funciones de IO que utiliza para asegurarse de cuáles se cierran y cuáles no. Por lo general, si incluyen la palabra use
(tal como useLines()
o use()
) cierras el arroyo después. Una excepción es que File.readText()
difiere de Reader.readText()
en que el primero no deja nada abierto y el segundo sí requiere un cierre explícito.
Ver también: Funciones de extensión relacionadas con Kotlin IO
Un ejemplo que lee el contenido de un InputStream a una cadena
import java.io.File
import java.io.InputStream
import java.nio.charset.Charset
fun main(args: Array)
val file = File("input"+File.separator+"contents.txt")
var ins:InputStream = file.inputStream()
var content = ins.readBytes().toString(Charset.defaultCharset())
println(content)
Para referencia: archivo de lectura de Kotlin
No se te olvide mostrar esta crónica si te valió la pena.