La Capture de la sortie d'un programme externe en JAVA
Je suis en train d'essayer de capturer la sortie d'un programme externe à l'aide de java, mais je ne peux pas.
J'ai le code pour le montrer, mais de ne pas le mettre dans une variable.
Je vais l'utiliser, par exemple, sqlplus pour exécuter mon oracle code "dans exec.sql"
système/orcl)@orcl): utilisateur/mot de passe/nom DB
public static String test_script () {
String RESULT="";
String fileName = "@src\\exec.sql";
String sqlPath = ".";
String arg1="system/orcl@orcl";
String sqlCmd = "sqlplus";
String arg2 = fileName;
try {
String line;
ProcessBuilder pb = new ProcessBuilder(sqlCmd, arg1, arg2);
Map<String, String> env = pb.environment();
env.put("VAR1", arg1);
env.put("VAR2", arg2);
pb.directory(new File(sqlPath));
pb.redirectErrorStream(true);
Process p = pb.start();
BufferedReader bri = new BufferedReader
(new InputStreamReader(p.getInputStream()));
while ((line = bri.readLine()) != null) {
RESULT+=line;
}
System.out.println("Done.");
}
catch (Exception err) {
err.printStackTrace();
}
return RESULT;
}
Ce que vous demandez n'est pas clair. Vous pouvez le voir avec
Le RÉSULTAT est vide au début, mais dans la boucle while j'ai fait la concaténation --> RESULT+=ligne;
ok mais pouvez-vous voir les lignes imprimées avec
Shouldnt vous lisez à partir de la outputstream du programme externe? p.getOutputStream()
J'ai corrigé les erreurs
System.out.println(line);
, mais RESULT
est vide?Le RÉSULTAT est vide au début, mais dans la boucle while j'ai fait la concaténation --> RESULT+=ligne;
ok mais pouvez-vous voir les lignes imprimées avec
System.out.println(line);
? Notez également que, parce que vous avez redirigé le flux d'erreur, vous n'avez pas besoin bre
- tout sera diffusé à bri
.Shouldnt vous lisez à partir de la outputstream du programme externe? p.getOutputStream()
J'ai corrigé les erreurs
OriginalL'auteur AHméd Net | 2013-01-26
Vous devez vous connecter pour publier un commentaire.
Parce que le Processus s'exécute dans un nouveau thread, il est probable qu'il n'y a pas de sortie ou incomplète de sortie disposition lorsque vous arrivez à votre boucle while.
Si vous avez besoin d'attendre la fin du processus avant de tenter d'interagir avec la sortie de la. Essayez d'utiliser le Processus.waitFor() méthode pour mettre en pause le thread courant jusqu'à ce que votre processus a eu l'occasion de se terminer.
Ce n'est qu'une simple approche que l'on pourrait également traiter la sortie du processus lorsqu'il s'exécute en parallèle, mais vous devez surveiller l'état du processus est-il toujours en cours d'exécution ou s'est-il terminé, et la disponibilité de sortie.
merci jsuhre 🙂
OriginalL'auteur jsuhre
Utilisation Apache Commons Exec, il rendra votre vie beaucoup plus facile. De vérifier la tutoriels pour plus d'informations sur l'utilisation de base. Pour lire la sortie de ligne de commande après l'obtention d'un
executor
objet (probablementDefaultExecutor
), de créer unOutputStream
à ce que le flux que vous souhaitez (j'.e unFileOutputStream
instance peut être, ouSystem.out
), et:C'est une bibliothèque java. Croyez-moi, il va vous faire économiser BEAUCOUP d'effort. Si vous rencontrez des problèmes avec, de le poster ici et je serai heureux de vous aider, en tout temps 🙂
ok je vais le tester 😀
comment puis-je l'utiliser Maintenant 😀
J'ai édité ma réponse pour plus de précisions.
OriginalL'auteur Muhammad Gelbana