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

Langage Java Discussion :

Exécuter une application externe à Java


Sujet :

Langage Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2008
    Messages : 38
    Par défaut Exécuter une application externe à Java
    Hello,

    Je suis entrain de faire un programme qui me permet d'exécuter une application externe à java, j'ai lu des tutoriaux à se sujet, mais je bloque sur un point. J'aimerai pouvoir écrire le mot de passe quand la ligne de commande me le demande, mais je ne sais pas comment faire.
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     Runtime runtime = Runtime.getRuntime();
                final Process process = runtime.exec("monappli");
     
    // Consommation de la sortie standard de l'application externe dans un Thread separe
                new Thread() {
     
                    public void run() {
                        try {
                            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                            reader.close();
                        } catch (IOException ioe) {
                            ioe.printStackTrace();
                        }
                    }
                }.start();
     
    // Consommation de la sortie d'erreur de l'application externe dans un Thread separe
                new Thread() {
     
                    public void run() {
                        try {
                            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
                            reader.close();
                        } catch (IOException ioe) {
                            ioe.printStackTrace();
                        }
                    }
                }.start();
     
            } catch (IOException ex) {
                Logger.getLogger(Programme.class.getName()).log(Level.SEVERE, null, ex);
            }
    Merci de votre aide

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 28
    Par défaut
    Voici un extrait de code que j'utilise pour charger un fichier Excel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Runtime.getRuntime().exec("cmd /C start excel " + fichier.getAbsolutePath());
    Le parametres sont passés directement.
    Sinon il doit bien exister des libs d'execution externes.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2008
    Messages : 38
    Par défaut
    Le programme que j'utilise n'accepte pas qu'on lui passe le mot de passe directement! C'est pour ça que je dois l'écrire dans la commande

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Par défaut
    Ben il faut qu'en plus tu utilises le "process.getOutputStream()" pour envoyer le mot de passe à l'entrée standard du programme.
    Le pb c'est qu'il faut le faire au bon moment, car il y a sans doute une invitation texte qui demande à l'utilisateur d'entrée son mot de passe.
    Donc il faudra n'envoyer des données vers cet outputstream qu'après avoir lu suffisamment de text (correspondant à l'invitation texte) dans le inputstream du process.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2008
    Messages : 38
    Par défaut
    Exactement, il y a une invitation texte.

    Par contre, je ne vois pas comment faire pour savoir quand il fait la demande, pour lui envoyer au bon moment!

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Par défaut
    Ben, tant qu'il y a qqchose dans le flux process.getInputStream(), c'est que le programme n'a pas fini d'ecrire l'invitation text.
    Tu peux même reconstituer ce flux en text et le comparer avec le message que tu attend.
    Quand il n'y a plus rien dans process.getInputStream() tu dois pouvoir écrire dans le process.getOutputStream() le mot de passe.

    J'espere que le shell ne demande que le mot de passe sinon, il faudra répéter la phase "lecture de l'inputstream question"/"écriture dans l'outputstream réponse" autant de fois qu'il y a de questions.

    Par rapport à ce que tu as, commence déja par ne plus bufferiser et fermer automatiquement le flux de process.getInputStream().

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2008
    Messages : 38
    Par défaut
    Ok merci, je vais tester ceci

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2008
    Messages : 38
    Par défaut
    Alors, je fais ceci pour lire les traitements que la console me sors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    new Thread() {
     
                            @Override
                            public void run() {
                                try {
                                    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                                    String line = "";
                                    try {
                                        while ((line = reader.readLine()) != null) {
                                            maListe.add(reader.readLine());
                                        }
                                    } finally {
                                        reader.close();
                                    }
                                } catch (IOException ioe) {
                                    ioe.printStackTrace();
                                }
                            }
                        }.start();
    Le problème est que le readLine ne m'écrit pas tout ce que la console m'écrit quand je l'exécute directement depuis la commande dos, est-ce normale ?

    Il me met également une erreur quand j'essaye de lire ce que contient ma liste : Exception in thread "Thread-0" java.lang.NullPointerException


    Pourtant j'ai initialisé maListe ...

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Par défaut
    J'ai jamais fait exactement ce que tu cherches à faire, mais je te mets le code d'une fonction qui recopie le contenu d'un stream vers un autre (ma log en l'occurence) au fur et à mesure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    private void createStreamThread(final InputStream is, final OutputStream os) {
    		curThread = new Thread(new Runnable() {
    			public void run() {
    				BufferedInputStream bis = new BufferedInputStream(is);
    				BufferedOutputStream bos = null;
    				if(os != null)
    				{
    					bos = new BufferedOutputStream(os);
    				}
    				byte[] data = new byte[2048];
    				int nbRead = 0;
    				try
    				{
    					while(curThread.isAlive() &&(nbRead = bis.read(data)) > 0)
    					{
    						if(bos != null){
    							if(finished){
    						    	break;
    						  	}
    							bos.write(data, 0, nbRead);
    							bos.flush();
    						}
    						Thread.sleep(500);
    					}
    					//stopTimer(); 
    				} catch(IOException ioe) {
    					ioe.printStackTrace();
    				} catch (InterruptedException e)
    				{
    					e.printStackTrace();
    				}
    			}
    		});
    		curThread.start();
    	}
    et je l'appellais comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    createStreamThread(p.getInputStream(),logOutputStream);
    Je pense que le pb vient du faite que tu raisonnes en lignes de charactères.
    Or rien ne t'assure que le process ne cessera pas d'envoyer des charactères avant d'envoyer un retour à la ligne. Donc faire un appel à reader.readLine() va bloquer le thread en lecture et n'exectura jamais la suite.
    C'est pour ça que je pense qu'il faut raisonner en terme de flux d'octet avec des BufferedInputStream.
    Ensuite il faut reconstituer la chaine de charactère à l'aide des octets lus jusqu'ici pour la comparer avec la chaine d'annonce. Lorsque le test sera valide tu devrais pouvoir ecrire dans le outputstream du process le mot de passe.
    Voila, bon courage.

    Sinon pour ton erreur, il y a une coquille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while ((line = reader.readLine()) != null)
    {
        //maListe.add(reader.readLine()); tu lis la ligne suivante qui peut être null
        maListe.add(line);
    }

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2008
    Messages : 38
    Par défaut
    Ok, merci beaucoup !

  11. #11
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Par défaut
    bonjour,
    j'ai le meme soucis qu'à eu Noizet. Suite à votre discussion j'ai essayé de résoudre mon probleme mais mes problemes persistent. Mon premier probleme est que rien de s'affiche sur l'entrée standard de mon programme externe qui comme pour Noizet me demande des informations par une invitation texte. Et de plus, j'ai aps une seule demande mais plusieurs donc quel type de boucle devrais je faire?
    Excusez moi mais je suis débutante et de plus pas programmatrice de formation juste amatrice. Merci

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 2
    Par défaut
    slt a tous ! je cherche comment :

    ecrire un programme qui va crée un fichier, puis le transmettre a une autre application qui va trouver le resultat, puis l'afficher dans une fenetre ! est ce possible ?? svp c important

  13. #13
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 155
    Par défaut
    Alerte double nécropost

    c'est possible.
    Pour créer un fichier, utilise la classe File (puis un writer/outputStream pour écrire dedans).
    Comme tu l'as crée, tu connais son chemin, donc tu peux le passer en paramètre de ton autre application que tu peux lancer avec un exec.

    Voir un tutoriel de développez.com/java pour l'exec.

Discussions similaires

  1. Exécuter une application externe
    Par mawkli dans le forum Langage
    Réponses: 16
    Dernier message: 03/07/2012, 11h55
  2. Exécuter une application externe avec survie après Java
    Par Claythest dans le forum Général Java
    Réponses: 8
    Dernier message: 20/11/2009, 14h23
  3. exécuter une application externe à java
    Par meli82 dans le forum Langage
    Réponses: 8
    Dernier message: 28/07/2009, 11h38
  4. Exécuter une application externe pas à pas
    Par leyo666 dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 07/04/2007, 18h41

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