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

API standards et tierces Java Discussion :

Pipe UNIX et commande exec


Sujet :

API standards et tierces 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 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 8
    Par défaut Pipe UNIX et commande exec
    Bonjour,

    Je rencontre le même problème que sur ce topic (http://www.developpez.net/forums/d41...ipe-unix-exec/). Je veux exécuter une commande dans mon programme Java (qui contient un pipe)

    J'ai essayé cette solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Process ls = Runtime.getRuntime().exec("ls -l");
    Process wc = Runtime.getRuntime().exec("wc -l");
     
    InputStream lsOutput = ls.getInputStream();
    OutputStream wcInput = wc.getOutputStream();
     
    // On 'copie' la sortie de ls dans l'entrée de wc :
    int c;
    while ( (c = lsOutput.read()) != -1 ) {
          wcInput.write(c);
    }
     
    lsOutput.close();
    wcInput.close();
    Mais ça ne marche pas car
    le InputStream n'a pas de write et le OutputStream n'a pas de read

    Comment faire?

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Dans ton code, le InputStream utilise un read et le OutputStream utilise un write. Ce code est correct.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre chevronné Avatar de Mandraxx
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2011
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 182
    Par défaut
    Bonjour,

    Le principe de l'algo est tout à fait correct : m'est avis que c'est un problème de protocole....

    En effet, vu ton code, il y a de fortes chances que ton protocole d'échange soit binaire (ou du moins caractère par caractère, ce qui revient au même vu ce que tu cherches à faire...).

    Je te propose d'essayer de décorer ta lecture avec un BufferedReader et ton écriture avec un PrintStream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BufferedReader lsOutput = new BufferedReader(new InputStreamReader(ls.getInputStream()));
    PrintStream wcInput = new PrintStream(wc.getOutputStream());
    Du coup, ton algo va pouvoir implanter un vrai protocole texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    String line = lsOutput.readLine();
    while (line != null) {
        wcInput.println(line);
        line = lsOutput.readLine();
    }
    lsOutput.close();
    wsInput.flush();
    wsInput.close();
    Ca peut éviter les problèmes de broken pipe ou de dead locks sur attente de caractères.

    @+

  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 Mandraxx Voir le message
    Le principe de l'algo est tout à fait correct : m'est avis que c'est un problème de protocole....

    En effet, vu ton code, il y a de fortes chances que ton protocole d'échange soit binaire (ou du moins caractère par caractère, ce qui revient au même vu ce que tu cherches à faire...).
    Non il vaut mieux éviter d'utiliser des Reader ici. Tu veux transmettre les données d'un process à l'autre autant recopier le flux directement. Sinon tu vas effectuer un décodage/encodage totalement inutile qui risque en plus de poser des problèmes potentiels d'encodage...


    La copie des flux est tout à fait correct... Même s'il aurait été préférable d'utiliser un buffer.

    Toutefois il manque quand même la fermeture des flux inutilisés, et l'utilisation des try/finally pour la libération des ressources...


    Par contre le code ne sert à rien car la sortie du "wc -l" n'est pas lu...



    a++

  5. #5
    Membre chevronné Avatar de Mandraxx
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2011
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 182
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Non il vaut mieux éviter d'utiliser des Reader ici. Tu veux transmettre les données d'un process à l'autre autant recopier le flux directement. Sinon tu vas effectuer un décodage/encodage totalement inutile qui risque en plus de poser des problèmes potentiels d'encodage...
    Oui, autant pour moi, j'avais pas pensé à ça avec mon raisonnement purement système

    Citation Envoyé par adiGuba Voir le message
    Même s'il aurait été préférable d'utiliser un buffer.
    Tout à fait d'accord

  6. #6
    Membre très actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Par défaut
    Salut,

    Juste une 'tite question : dans le sujet que tu as donné (pour un problème identique), il y a cette solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Process process = Runtime.getRuntime().exec("/bin/sh", "-c", "ls -l | wc -l");
    Elle ne te convient pas ? Ca me semble quand même plus simple que d'utiliser des buffer...

    DarkSeiryu

Discussions similaires

  1. [Runtime,exec] Comment faire un pipe unix dans le exec ?
    Par Escuzze dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 06/03/2008, 12h48
  2. [perl] Pipe dans une commande UNIX
    Par floxi dans le forum Linux
    Réponses: 6
    Dernier message: 29/08/2007, 00h21
  3. [Système] commande exec en arriere plan
    Par dgedge dans le forum Langage
    Réponses: 3
    Dernier message: 03/07/2006, 14h45
  4. Réponses: 10
    Dernier message: 02/03/2006, 11h36
  5. [Système] commande exec()
    Par Stef784ever dans le forum Langage
    Réponses: 5
    Dernier message: 24/11/2005, 10h53

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