Impossible de lire InputStream de Processus Java (Runtime.getRuntime().exec() ou ProcessBuilder)
Je suis en train de commencer un processus externe avec Java et ne peut pas lire quoi que ce soit à partir de son InputStream.
Si je suis au début d'un processus avec des commandes comme "ls", "ps" ou "tuer" tout fonctionne bien. Je peux commencer le processus et d'obtenir des informations sur l'InputStream ou la ErrorStream du Processus.
Si j'essaie d'utiliser la commande "ftp" ou "telnet" les deux InputStream et ErrorStream sont le blocage de mon programme lorsque vous essayez de lire. Aucune information n'est transmise par le biais de ces cours d'eau à tout moment.
Quelqu'un peut-il expliquer le comportement? Est-il tout simplement pas possible avec ces commandes, ou dois-je avoir un problème avec mon application?
String processName = _configuration.getProgramCommand().getCommand();
ProcessBuilder procBuilder = new ProcessBuilder(processName);
System.out.println("Starting process "+processName);
_proc = Runtime.getRuntime().exec(processName);//procBuilder.start();
if(!procBuilder.redirectErrorStream()) {
_errorWorker = new ProcessErrorWorker(_proc);
_errorWorker.start();
}
String proc_start_answer = _configuration.getNextCommand().getCommand();
System.out.println("Waiting for process answer '"+proc_start_answer+"'");
BufferedReader input = new BufferedReader(new InputStreamReader(_proc.getInputStream()));
String answer = "";
try {
System.out.println("inputstream ready: "+input.ready());
answer+=input.readLine();
System.out.println("process answer: "+answer);
input.close();
} catch(Exception e) {
System.out.print(e.getMessage());
}
- Avez-vous obtenir ce problème résolu ? Vous pouvez poster dans la solution ?
Vous devez vous connecter pour publier un commentaire.
Je me rends compte de cette question est vieux, mais j'ai juste eu le même problème. Pour corriger cela, j'ai utilisé ce code..
Il semble que le processus vous attend également à lire à partir du flux d'Erreur. Le meilleur correctif pour ce qui est de fusionner l'entrée et les flux d'erreur ensemble.
Mise à jour
Je ne savais pas que vous avez tenté de lire à partir du flux d'erreur aussi. Il pourrait être simplement que vous avez besoin de fusionner manuellement avec
redirectErrorStream(true)
J'ai eu ce problème avec un programme en C de l'impression à la sortie standard stdout...
La
redirectErrorStream(true)
solution avec unfflush(stdout)
dans le code C a fait le tour pour moi.Vous avez besoin pour faire ce travail dans un Thread. Par exemple, pour connecter la sortie standard:
Alors vous avez besoin d'un deuxième thread pour gérer les entrées. Et vous pouvez traiter avec stderr tout comme la sortie standard stdout.
Après avoir lutté pendant des jours, et d'essayer de nombreuses options j'ai trouvé une solution. Travail sur Ubuntu 14.04 x64, avec jdk 8 u 25. Cette codereview post m'a donné l'astuce.
L'astuce est d'utiliser
InputStream#available()
avant de lire quoi que ce soit avec laBufferedReader
. Personnellement, j'ai deux fils, l'un pour la sortie standard et l'autre pour la sortie stderr. Voici un simple exécutant extrait de j'ai extrapolé à partir de mon programme. Si vous ne voulez pas tout lire, juste sauterreadLine()
J'ai eu le même problème avec le ftp, jusqu'à ce que j'ai remarqué que ftp détecte si elle est appelée à partir d'un terminal ou non.
Lorsque le protocole ftp n'est pas appelée à partir d'un terminal, il suspend toute sortie vers stdout, à moins que le verbose (-v), l'option est fournie.
La raison pour laquelle le flux de blocage, c'est que rien n'est écrit pour eux.
J'ai eu exactement le même problème. Malheureusement
ne fonctionne pas pour moi; il m'a donné une idée de ce qui est mal. Essayez d'utiliser la ligne suivante de code pour afficher la sortie stderr contenu:
Il m'a aidé à comprendre ce qui n'allait pas avec mon terminal la commande de chaque thread.