2017-08-24 2 views
1

Je veux écrire un code de Kotlin qui fonctionne essentiellement une commande:Comment est-ce que j'écrirais le code de kotlin idiomatique qui boucle sur un sous-processus et traite la production de lui?

Runtime.getRuntime().exec("mycommand.sh") 

Mais, dans ce cas mycommand.sh ne sera jamais sortie. Il sortira sporadiquement le texte que je veux traiter. Imaginons que la sortie est comme suit:

FOOBAR 1234 
BARFOO 54657 
ETCETC 9876 

Dis la première ligne arrive à 5 secondes, puis la seconde à 10 secondes, et la troisième à 15 secondes.

Comment est-ce que j'écrirais le code qui reçoit chaque ligne quand elle entre et la traite? Par exemple, peut-être que je veux extraire les mots en majuscules et retirer le nombre qui suit, puis stocke ces deux morceaux de texte en tant que valeurs-clés dans une carte de hachage.

En prime, j'aimerais savoir comment terminer le sous-processus (signal avec SIGINT?) À partir du programme kotlin.

Répondre

1

Peut-être quelque chose comme ceci:

val inStream = BufferedReader(InputStreamReader(proc.inputStream)) 
val map = inStream.lines() 
       //maybe you need a more sufficient solution here 
       .map { it.split(" ") } 
       .map { it[0] to it[1] }.toList() 

Cela se traduira par un List de Pair s alors. La méthode infixto crée les Pair s, qui sont de simples associations de valeurs de clé.