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

Java Discussion :

récupérer le retour d'une fonction unix


Sujet :

Java

  1. #1
    Membre expert
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 3 100
    Points
    3 100
    Par défaut récupérer le retour d'une fonction unix
    bonjour, je souhaite récupérer le retour d'une fonction unix, voila le code que j'ai écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    import java.io.*;
     
    public class Essai{
            public static void main(String[] args) throws Exception {
                    String commande = "wc -l cheminFichier1 | awk '{print $1}'";
                    Process processus = Runtime.getRuntime().exec(commande);
                    BufferedReader d = new BufferedReader(new InputStreamReader(processus.getInputStream()));
                    System.out.println(d.readLine());
            }
    }
    seulement bien que normalement ma commande me renvoi le nombre de ligne du fichier c'est à dire 10,
    java lui renvoie " 10 cheminFichier1 ", alors effectivement je pourai extraire le 10 qui m'interesse, mais dans ce cas la le pipe de ma commande ne sert plus à rien.

    merci de votre aide
    dam's

  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,


    Deux remarques :
    • Il faut lire tous les flux du process (stdout et stderr) depuis des threads séparés. Si tu l'aurais fais tu aurais surement vu un joli message d'erreur...
    • Runtime.exec() lance un programme et non pas une ligne de commande. Du coup ici | awk '{print $1}' sont trois paramètres passé à la commande wc, comme si tu avais fais en ligne de commande :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      wc -l cheminFichier1 "|" awk '{print $1}'


    Si tu veux lancer une ligne de commande il faut lancer le shell (/bin/sh)

    Plus d'info :



    Bonne lecture...

    a++

  3. #3
    Membre expert
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 3 100
    Points
    3 100
    Par défaut
    merci pour les liens, ils sont vraiment bien
    du coup voila ce que j'ai fais =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Runtime runtime = Runtime.getRuntime();
    Process process = runtime.exec(new String[] { "/bin/sh", "-c", "wc -l Fichier1 | awk '{print $1}'" } );
    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String line =  reader.readLine();
    System.out.println("nombre de lignes : " + line);
    par contre j'ai pas utilisé de thread, je sais pas si c'est "pas bien ou pas"
    dam's

  4. #4
    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
    Citation Envoyé par dams78 Voir le message
    par contre j'ai pas utilisé de thread, je sais pas si c'est "pas bien ou pas"
    Si tu n'utilises pas de thread il faut fermé le flux d'erreur (mais du coup il te sera impossible de détecter un éventuel problème).

    Au passage je te conseille également de fermer le flux d'entrée si tu ne l'utilise pas, et de lire la totalité du flux de sortir (ou de le fermer rapidement) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Runtime runtime = Runtime.getRuntime();
    Process process = runtime.exec(new String[] { "/bin/sh", "-c", "wc -l Fichier1 | awk '{print $1}'" } );
    // On ferme le flux d'entrée
    process.getOutputStream().close();
    // Et le flux d'erreur :
    process.getErrorStream().close();
    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    try {
        String line =  reader.readLine();
        System.out.println("nombre de lignes : " + line);
    } finally {
        reader.close();
    }

    • Pourquoi fermer le flux d'entrée ? Car si la commande lit dans son stdin cela la bloquera en attente de lecture. En le fermant cela lui génèrera un EOF...
    • Pourquoi fermer le flux d'erreur ? Si tu ne le lis pas et que le programme écrit dans le flux d'erreur cela peut aussi le bloquer. En effet il écrit en réalité dans un petit buffer et si ce dernier n'est pas vidé par ton application la commande appelée sera bloquée en écriture... Tant qu'à ignorer les erreurs autant que cela ne pose pas d'autres problèmes...
    • Pourquoi fermer le flux standard ? Pour la même raison que ci-dessus si la commande écrit plus de ligne que prévu.


    Toutes ces remarques ne s'appliquent peut-être pas au cas présent, mais permettent plus de sécurité lors de l'appel d'un programme externe...


    a++

  5. #5
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 283
    Points : 380
    Points
    380
    Par défaut
    Et la commande suivante ne convient-elle pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java Essai `"wc -l cheminFichier1 | awk '{print $1}'"`
    Si c'est pour l'inclure en plein milieu d'un de tes codes java, tu perds la portabilité de ton code entier. Ce serait dommage

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

Discussions similaires

  1. Récupérer la valeur de retour d'une fonction JS
    Par gobgob dans le forum Bibliothèques et frameworks
    Réponses: 12
    Dernier message: 17/02/2009, 18h22
  2. Réponses: 4
    Dernier message: 19/01/2009, 11h12
  3. Réponses: 4
    Dernier message: 29/06/2008, 14h36
  4. Réponses: 5
    Dernier message: 14/06/2008, 13h30
  5. [PHP-JS] récupérer le retour d'une fonction javascript
    Par nadiaflamingenierie dans le forum Langage
    Réponses: 5
    Dernier message: 29/04/2008, 10h15

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