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

AWT/Swing Java Discussion :

[Swing] Exécution d'une commande système et récupération de la sortie


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7
    Par défaut [Swing] Exécution d'une commande système et récupération de la sortie
    Bonjour,

    Je débute depuis quelques jours sur Swing (via NetBeans) et je suis tombé sur un problème auquel je n'ai pas trouvé de réponse sur le web.

    Je suis en train de créer un gestionnaire de téléchargement utilisant wget pour gérer les transferts de fichiers. J'ai donc un wget.exe (pour l'instant je développe une version windows) que je lance en ligne de commande et qui se charge de télécharger les fichiers correspondant aux liens que je lui passe en ligne de commande.

    Mon interface Swing se lance donc avec un paramètre correspondant au chemin d'accès d'un fichier contenant toutes les URL des fichiers que je dois télécharger.
    J'arrive à lancer ma commande système exécutant wget mais je ne parviens pas à récupérer sa sortie standard pour réutiliser ces informations dans mon interface.

    Pour l'instant, je ne cherche qu'à récupérer la sortie de mon exécution et la balancer dans un JTextArea.

    Donc ma question est la suivante : comment récupérer en temps réel la sortie (standard ou d'erreur) d'une commande afin de modifier l'interface en fonction ?

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7
    Par défaut
    Oui tout ça pas de problème, c'est comme ça que j'arrive à lancer ma commande système mais ça n'explique pas comment récupérer la sortie standard tout en laissant le process s'exécuter.
    A moins que mon utilisation de getInputStream() soit erronée.

  4. #4
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par RisWaaq
    A moins que mon utilisation de getInputStream() soit erronée.
    Fais voir ton code et on pourra t'en dire plus

    a++

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7
    Par défaut
    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
        public static void main(String args[]) {
            if (args.length == 0)
                return;
            final String path = args[0];
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    MainFrame mf = new MainFrame();
                    mf.setVisible(true);
     
                    String cmd = "cmd /C C:\\wget\\wget.exe -i " + path + " -Sc";
                    // -i "file" -> télécharge toutes les cibles des liens contenus dans "file"
                    // -S -> télécharge et affiche le header avant de dl le fichier
                    // -c -> continue le téléchargement du fichier s'il a déjà commencé'
     
                    try {
                        Runtime run = Runtime.getRuntime();
                        Process p = run.exec(cmd);
     
                        String currentLine = null;
                        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
                       while ((currentLine = in.readLine()) != null) {
                            mf.jTextArea1.append(currentLine);
                        }
                        BufferedReader err = new BufferedReader(new InputStreamReader(p.getErrorStream()));
                        while ((currentLine = err.readLine()) != null) {
                            mf.jTextArea1.append(currentLine);
                        }
                    } catch (Exception e) {
                        System.out.println("Execution error " + cmd + e.toString());
                    }
                }
            });
        }

  6. #6
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Tu doit consommer tous les fluxs du Process dans des threads séparés (le sujet a déjà été abordé plusieurs fois sur le forum).
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  7. #7
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    C'est normal que ton interface ne soit pas mise à jours : tu effectues toutes la lecture des flux dans l'EDT. Du coups le thread qui s'occupe de raffraichir et d'afficher la fenêtre se retrouve bloquer ton interface est bloquée...

    De plus le traitement des flux de sortie standard et d'erreur doivent être effectué dans deux threads séparés pour éviter des problèmes d'interblocages... ([edit] a moins d'utiliser la classe ProcessBuilder de Java 5.0 qui permet de regrouper les deux flux -- quel version de Java tu utilises ?)

    a++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exécuter une commande système avec perl
    Par Olivier Regnier dans le forum Langage
    Réponses: 12
    Dernier message: 08/04/2007, 16h41
  2. Réponses: 3
    Dernier message: 27/03/2007, 14h39
  3. Réponses: 2
    Dernier message: 05/01/2007, 16h57
  4. exécuter une commande système à partir de sqlplus?
    Par c_moi_c_moi dans le forum Oracle
    Réponses: 24
    Dernier message: 08/11/2005, 15h11
  5. [Système] Pb exécution d'une commande externe
    Par licorne dans le forum Langage
    Réponses: 9
    Dernier message: 19/10/2005, 16h34

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