Maison > Java > javaDidacticiel > Comment gérer de manière fiable les flux d'entrée/sortie dans les processus Java ?

Comment gérer de manière fiable les flux d'entrée/sortie dans les processus Java ?

Mary-Kate Olsen
Libérer: 2024-12-17 21:16:11
original
789 Les gens l'ont consulté

How to Reliably Handle Input/Output Streams in Java Processes?

Processus Java avec flux d'entrée/sortie

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.

Contexte

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.

Résoudre le problème

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();
Copier après la connexion

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;
    }
}
Copier après la connexion

Limitations

Il est impératif de reconnaître les limites de cette approche :

  • Les commandes qui demandent une saisie à l'utilisateur peuvent provoquer l'apparition du programme ne répond pas.
  • L'hypothèse selon laquelle chaque sortie de processus est terminée par une nouvelle ligne peut ne pas être vraie dans tous les cas.
  • Des cas rares où la commande exécutée génère "--EOF--" peut conduire à comportement erroné.
  • Des parenthèses sans correspondance dans les commandes bash peuvent entraîner des erreurs de syntaxe et un processus résiliation.

Conclusion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal