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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
process.input(command);
return process.consumeAsString();
Cependant ce code me génère une exception
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.