Cet article explore les subtilités de l'utilisation des flux d'entrée et de sortie lorsque vous travaillez avec des processus Java. Nous nous concentrerons particulièrement sur la résolution des défis rencontrés dans le maintien de la fonctionnalité de ces flux.
L'exemple de code fourni illustre un scénario dans lequel des commandes peuvent être saisies dans le shell bash et le résultat qui en résulte est fait écho. Cependant, des problèmes surviennent après la lecture initiale, entraînant l'inopérabilité des flux de sortie suivants. Cet article vise à élucider ces problèmes et à proposer des solutions.
La première étape consiste à modifier l'extrait de code pour exploiter la classe ProcessBuilder, qui simplifie l'exécution des processus externes. Son principal avantage est la possibilité de rediriger le flux d'erreurs standard du processus enfant vers sa sortie standard.
ProcessBuilder builder = new ProcessBuilder("/bin/bash"); builder.redirectErrorStream(true); Process process = builder.start();
De plus, les boucles responsables de la lecture de la sortie standard du processus ont tendance à se bloquer, car elles se terminent uniquement à la fin. -of-file du lecteur. Pour résoudre ce problème, une technique impliquant une ligne « magique » est utilisée pour délimiter la conclusion du résultat de la commande shell.
while (scan.hasNext()) { String input = scan.nextLine(); writer.write("((" + input + ") && echo --EOF--) || echo --EOF--\n"); writer.flush(); line = reader.readLine(); while (line != null && ! line.trim().equals("--EOF--")) { System.out.println ("Stdout: " + line); line = reader.readLine(); } if (line == null) { break; } }
Il est impératif de reconnaître les limites de cette approche :
Les modifications décrites dans cet article fournissent une solution complète aux défis rencontrés dans le maintien de la fonctionnalité des flux d'entrée/sortie lorsque vous travaillez avec des processus Java. Bien que la technique puisse présenter certaines limites, elle offre un moyen fiable d'exécuter des commandes shell et de récupérer périodiquement leur sortie via une tâche planifiée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!