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 :
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 Runtime runtime = Runtime.getRuntime(); Process p = runtime.exec("theexternapplication.exe");
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.
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();
J'ai essayé d'utiliser l'API d'Adiguba. http://blog.developpez.com/adiguba?t...es_plus_simple
Pour lancer le processus
pour exécuter une commande :
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);
Cependant ce code me génère une exception
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 process.input(command); return process.consumeAsString();
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.
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)
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.
Partager