Lancer un programme externe en ligne de commande et récupérer les résultats
Bonjour
J'aimerais, avec JAVA, faire appel à un outil externe qui s'utilise en ligne de commande.
Je peux donc faire appel au code suivant :
Code:
1 2
| Runtime runtime = Runtime.getRuntime();
Process p = runtime.exec("theexternapplication.exe"); |
Puis, pour chaque commande que je veux transmettre à cette application, je peux exécuter le code suivant :
Code:
1 2 3 4
| BufferedWriter writer =new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
writer.append(command);
writer.newLine();
writer.flush(); |
Mon problème est que je souhaite récupérer la sortie renvoyée par l'outil externe (sous forme de chaîne de caractère). Je n'ai pas réussi, jusqu'à présent, à récupérer le résultat d'une commande passée à l'outil externe, le fait que la réponse soit asynchrone me gêne.
J'ai essayé d'utiliser l'API d'Adiguba. http://blog.developpez.com/adiguba?t...es_plus_simple
Pour lancer le processus
Code:
1 2 3 4 5 6 7 8 9 10 11
| sh = new Shell();
// On crée les StringBuilder qui contiendront les sorties du process :
StringBuilder out = new StringBuilder();
StringBuilder err = new StringBuilder();
// On crée l'instance de ProcessConsumer qui traitera les flux :
process = sh.command(parameters[0]);
// On redirige le flux de sortie et d'erreur
// (par défaut le flux d'entrée est ignoré,
// et les flux stdout/stderr renvoyent vers System.out/err)
process.error(err);
process.output(out); |
pour exécuter une commande :
Code:
1 2
| process.input(command);
return process.consumeAsString(); |
Cependant ce code me génère une exception
Code:
1 2 3 4 5 6 7 8 9
| java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2882)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:461)
at java.lang.StringBuilder.append(StringBuilder.java:179)
at java.lang.StringBuilder.append(StringBuilder.java:172)
at java.lang.StringBuilder.append(StringBuilder.java:55)
at [].ProcessConsumer.dump(ProcessConsumer.java:637)
at [].ProcessConsumer.consume(ProcessConsumer.java:506) |
Le problème me semble être le suivant : d'une part, comme je lance l'éxecution d'un seul processus auquel j'envoie des commandes les unes après les autre, l'API d'Adiguba n'est pas adaptée à mon cas. Elle serait plus adaptée si je pouvais effectuer ces commandes avec des appels de processus séparés.
D'autre part, l'outil externe appelé renvoie en permanence une petite chaîne de caractères (un prompt), d'où le problème de mémoire visible ici.
Mes questions sont :
1) Est-il possible de faire en Java ce que je veux faire, c'est-à-dire lancer un programme externe dont le fonctionnement se fait en ligne de commande, envoyer des commandes et, pour chaque commande, obtenir le résultat renvoyé par ce programme ?
2) Si oui, comment concrètement puis-je récupérer le résultat d'une commande, avec ou sans l'API d'Adiguba ? Ou peut-être avec d'autres APIs que je ne connais pas ?
Merci pour toute aide.