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

avec Java Discussion :

Rediriger sortie de script en temps reel


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 37
    Par défaut Rediriger sortie de script en temps reel
    Bonjour,

    Tout d'abord, je m'excuse d'avance pour les fautes d'accents, mais je me trouve sur un clavier qwerty...

    Pour mon travail, je developpe une interface en Java, qui utilise des scripts externes censes etre utilises en Bash sous Linux/Unix.

    Lorsque je lance un script, je redirige la sortie vers un textArea afin d'afficher le resultat a l'utilisateur. (en utilisant System.setOut... et en recuperant le inputStream).

    Voici mon package qui me permet de lancer ma commande et recuperer l'output a la fin du processus :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
     
    package Tools;
     
    import java.io.*;
     
    public class ExecuteThatCommand {
     
              String[] command = {"sh", "-c", null};
              String errMsg;
              String outMsg;
              int outCode;
     
              static class PipeInputStreamToOutputStream implements Runnable {
                        PipeInputStreamToOutputStream(InputStream is, OutputStream os) {is_ = is;os_ = os;}
                        public void run() {
                                  try {
                                            byte[] buffer = new byte[1024];
                                            for (int count = 0; (count = is_.read(buffer)) >= 0;) {
                                                        os_.write(buffer, 0, count);
                                            }
                                  } catch (IOException e) {e.printStackTrace();}
                        }
                        private final InputStream is_;
                        private final OutputStream os_;
              }
     
              public void prepare(String arg) {
                        command[2] = arg;
                        errMsg = null;
                        outMsg = null;
                        outCode = -1;
              }
     
              public void run() {
                        ByteArrayOutputStream baosOut = new ByteArrayOutputStream();
                        ByteArrayOutputStream baosErr = new ByteArrayOutputStream();
                        try {
                                  final Process process = Runtime.getRuntime().exec(command);
                                  new Thread(new PipeInputStreamToOutputStream(process.getInputStream(), baosOut)).start();
                                  new Thread(new PipeInputStreamToOutputStream(process.getErrorStream(), baosErr)).start();
                                  outCode = process.waitFor();
                        } catch (Exception e) {
                                  StringWriter sw = new StringWriter();
                                  PrintWriter pw = new PrintWriter(sw);
                                  e.printStackTrace(pw);
                                  errMsg = sw.toString();
                                  outMsg = "Java Errors append : ";
                                  outCode = -1;
                        }
                        outMsg = baosOut.toString();
                        errMsg = baosErr.toString();
              }
     
              public String getCompleteMessage() {if (errMsg != null && outMsg != null) {return outMsg + errMsg;} else {return "";}}
              public String getErrMessage() {if (errMsg != null) {return errMsg;} else {return "";}}
              public String getOutMessage() {if (outMsg != null) {return outMsg;} else {return "";}}
              public int getOutCode() {return outCode;}
    }
    Jusque la tout va bien, mais mon probleme est que certains scripts peuvent etre longs (tres longs), et j'aimerais rediriger la sortie de ces scripts vers mon textArea en temps reel afin que l'utilisateur soit informe de l'etat du script.

    En cherchant sur internet, j'ai trouve quelques solutions comme rediriger la sortie vers un fichier et lire le fichier (ce qui me parait un peu moche comme methode), ou bien des solutions qui ne fonctionnent pas en temps reel.

    Auriez vous une idee a me soumettre afin de realiser cela?

    Merci,

    Raphael.

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    au lieu, dans votre thread, de redireiger vers un bytearayoutputstream, faites directement dedans l'opération d'écriture dans le TextArea. Un truc dans ce gout là


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    static class StreamToTextArea implements Runnable {
                        StreamToTextArea(InputStream is, JtextArea out) {reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));this.out = out;}
                        public void run() {
                                  try {
                                            String line = null;
                                            while ((line=reader.readLine()!=null){
                                                out.setText(out.getText()+line); // a passer dans un SwingUtilities.invokeLater!
                                            }
                                  } catch (IOException e) {e.printStackTrace();}
                        }
                        private final BufferedReader reader;
                        private final JTextArea out;
              }

  3. #3
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 37
    Par défaut
    Merci pour ta reponse, j'ai deja essaye cette methode en passant par un bufferedReader.
    Le probleme est que tout s'affiche bien dans mon textArea mais uniquement a la fin de mon script.

  4. #4
    Membre chevronné

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Par défaut
    Question bête, mais est-tu sûre que ton script envoi bien les données au fur et à mesure sur la sortie standard ?

    car si il les garde en mémoire et ne les publies qu'à la fin...
    (question qui m'est venu en lisant le post.)

  5. #5
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 37
    Par défaut
    Oui oui, pour mes tests je lance un petit script test que j'ai fait, qui affiche un entier incremente toutes les secondes pendant 10 secondes.

    En le lancant sur une console, j'ai bien mes entiers qui s'affichent au fur et a mesure.

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    il y a bien un retour à la ligne à chaque fois?

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/06/2012, 13h49
  2. filtrage temps reel de la sortie d'un programme dans terminal
    Par filipaillou dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 30/04/2010, 14h31
  3. [script] temps reel d'execution
    Par rberthou dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 30/06/2009, 14h51
  4. Réponses: 5
    Dernier message: 19/07/2004, 17h27
  5. Linux et le temps réel
    Par Shrem dans le forum Administration système
    Réponses: 6
    Dernier message: 11/12/2002, 08h21

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