web-dev-qa-db-fra.com

Meilleure façon d'utiliser BufferedReader à Kotlin

Je viens donc de commencer à utiliser Kotlin pour Android et de convertir mes codes Java Android en Kotlin.

Dans l'une des conversions, je suis tombé sur un BufferedReader, que j'écrirais habituellement en Java comme suit:

String result = "";
String line = "";
BufferedReader reader = new BufferedReader(someStream);
while ( (line = reader.readLine()) != null ) {
    result += line;
}

Mais à Kotlin, il semble que Kotlin ne me permette pas d’attribuer des valeurs à des variables en conditions while.

Actuellement, j'ai écrit le code comme suit:

val reader = BufferedReader(someStream)
var line : String? = ""
while (line != null) {
    line = reader.readLine()
    result += line
}

que je ne trouve pas si élégant et qui me semble pré-générique, malgré l’utilisation de Kotlin.

Quelle serait la meilleure façon d'utiliser BufferedReader à Kotlin?

14
Akira Kido

Vous pouvez utiliser bufferedReader like so

val allText = inputStream.bufferedReader().use(BufferedReader::readText)
42
miensol

Si vous voulez toujours le lire ligne par ligne, vous pouvez utiliser certaines fonctions d'extension de std lib et le faire comme suit:

val reader = someStream.bufferedReader()
val iterator = reader.linesSequences().iterator()
while(iterator.hasNext()) {
    val line = iterator.next()
    // do something with line...
}
reader.close()

ou alternativement, en utilisant une approche "fonctionnelle":

val reader = someStream.bufferedReader()
reader.useLines {
    it.map { line -> // do something with line }
}

en utilisant useLines, vous n'avez pas besoin d'appeler explicitement close sur le lecteur, la fonction d'extensions useLines le fera pour vous!

Il suffit d’ajouter celles-ci à titre de référence.

7
João Gonçalves

Une autre façon consiste à utiliser une boucle for:

val reader = BufferedReader(someStream)
for (line in reader.lines()) {
    println(line)
}

Bien qu’elle ne soit pas aussi concise que la réponse acceptée, elle vous permettra de parcourir en boucle et d’exécuter une sorte de logique sans tout empiler en une seule chaîne, comme indiqué ci-dessous

val allText: String = inputStream.bufferedReader().use(BufferedReader::readText)
0
Chris Ritchie

utiliser le code comme ça


 val input = conn.inputStream 
 val allText = input.bufferedReader (). use (BufferedReader :: readText) 
 val result = StringBuilder () 

 result.append (allText) 
 renvoie result.toString () 

 } autre {

 renvoyer "échec" 

 } 

0
reza rahmad