IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Lancer un programme externe en ligne de commande et récupérer les résultats


Sujet :

Entrée/Sortie Java

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut 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 : 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.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par a___B Voir le message
    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.
    Oui tout à fait : si ton programme renvoi tout le temps la même chose cela va générer une chaine de caractère immense, et donc une OutOfMemory au bout d'un moment...

    Citation Envoyé par a___B Voir le message
    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 ?
    Oui et non... Ca dépend de ce que tu veux exactement.

    Je suppose que tu veux lancer un genre de shell et obtenir pour chaque commande la réponse précise...

    Pour cela tu peux utiliser des PipedReader/Writer pour envoyer/recevoir les message (que ce soit avec mon API ou directement avec Runtime - mais alors tu devras gérer les threads), mais le problème étant de savoir où s'arrête la réponse et où commence le reste du message...


    a++

Discussions similaires

  1. Lancer programme graphique en ligne de commande
    Par RyzenOC dans le forum Shell et commandes GNU
    Réponses: 34
    Dernier message: 14/10/2014, 21h49
  2. Réponses: 2
    Dernier message: 21/05/2006, 09h30
  3. [Système] Lancer un programme externe depuis une page web
    Par needles94000 dans le forum Langage
    Réponses: 2
    Dernier message: 08/02/2006, 21h34
  4. lancer un programme externe et continuer
    Par seal3 dans le forum C++
    Réponses: 6
    Dernier message: 31/10/2005, 19h00
  5. lancer un script asp en ligne de commande
    Par niel5 dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 26/08/2005, 11h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo