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 :

probleme de recuperation de données


Sujet :

Langage Java

  1. #1
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 258
    Par défaut probleme de recuperation de données
    bonjour,

    lorsqu' a partir de mon appli java je souhaite executer une commande windows, je n'arrive pas a recuperer de resultats.


    voici des morceaux de 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
    try {
    process = Runtime.getRuntime().exec("cmd /K dir");		} catch (IOException e) {
    		e.printStackTrace();
    	}
     
    	try {
    		inn=new InputStreamReader(process.getInputStream(),"CP850");
    		} catch (UnsupportedEncodingException e) {
    			e.printStackTrace();
    		}
     
    		br= new BufferedReader(inn);
    		err = process.getErrorStream();
    		readClearCaseClient(buf, br);//ici ca bloque alors qu'avant pas de probleme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public  void readClearCaseClient(StringBuffer buf,BufferedReader br){
    		String ligne;
    		try {
    			while((ligne=br.readLine())!="hello"  || ligne=br.readLine())!=null ){
    				buf.append(ligne).append("\n");
    			}
     
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}


    Voila je vous remercie

  2. #2
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    Je crois qu'il faut mieux utiliser un tableau de String pour les paramètres ... t'as essayé ?

    Sinon, quelle est l'erreur, tu parles d'un blocage dans les commentaires, ça tourne en boucle ou ça plante (dans ce cas dis nous quelle est l'erreur) ?

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 258
    Par défaut
    ca tourne en boucle la où j'ai mis le commentaire...

  4. #4
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 258
    Par défaut
    je viens d'avoir une erreur:

    Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space

  5. #5
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    dans ton while, c'est un "&&", pas un "||" !
    et +1 pour utiliser un tableau de string pour la commande à passer, si tu continues de faire comme ça, ça risque fortement de ne pas fonctionner.

  6. #6
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 258
    Par défaut
    je vais redemarrer ca me parait vraiment trop bizarre

  7. #7
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Remarque 1:
    Je ne vois de "waitFor" sur ton process dans ton code.
    Pour info, j'ai déjà eu des soucis avec cette omission...


    Remarque 2:
    Si je me rappelle bien, le traitement des flux doit se faire dans des Threads séparés, il doit y avoir un article qui en parle sur ce site ( FAQ, sources... ).

  8. #8
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 258
    Par défaut
    et +1 pour utiliser un tableau de string pour la commande à passer, si tu continues de faire comme ça, ça risque fortement de ne pas fonctionner.
    Comment ca?

  9. #9
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 258
    Par défaut encore plus simple!!
    voilà pour résoudre un pb, diminuons le nb de lignes:

    voici tout mon code; mon appli ne s'arrete malhereusement pas.

    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
     
    public class TestCmd {
     
     
    	public TestCmd() {
    		System.out.println("begin");
    		try {
    			Runtime r = Runtime.getRuntime();
                            Process p = r.exec("cmd /c dir");
                            p.waitFor();
    		}catch(Exception e) {
    			System.out.println("erreur d'execution "  + e.toString());
            }
     
     
    		System.out.println("fin");
     
    	}
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		new TestCmd();
    	}
     
    }
    Donc 'begin' s'affiche mais apres on peut toujours attendre... Des idées?

  10. #10
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    tu ne m'écoutes pas...
    Tableau de string plutot qu'une contenant tout
    String [] s={"cmd","arg1","arg2} != String s="cmd arg1 arg2"

  11. #11
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 258
    Par défaut OK je t'écoute..
    bon j'ai fait comme effectivement j'aurais du faire; cependant le pb n'est toujours pas résolu!!

    Je te redonne le code, dis moi ce que tu en penses:

    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
    package test;
     
     
    public class TestCmd {
     
     
    	public TestCmd() {
    		System.out.println("begin");
    		try {
    			Runtime r = Runtime.getRuntime();
    			String [] s={"cmd","/c","dir"};
                Process p = r.exec(s);
                p.waitFor();
    		}catch(Exception e) {
    			System.out.println("erreur d'execution " ); 
    			e.printStackTrace();
            }		
     
    		System.out.println("fin");
     
    	}
     
    	public static void main(String[] args) {
    		new TestCmd();
    	}
     
    }
    Comme d'habitude, 'begin' s'affiche à la console mais après, on peut toujours attendre...

  12. #12
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    et en mettant "dir" tout seul sans le "cmd /c" ?

  13. #13
    Membre chevronné Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Par défaut
    Ce n'est pas "vraiment" un problème de code mais plutôt d'agencement. Toi tu t'attends qu'une fois que ta commande est finie d'être exécutée, que le bufferedReader renvoit null et que ton programme continue. Mais voilà pas de bol, le bufferedReader ne renverra jamais null car il n'y a rien qui lui indique qu'il n'y aura plus rien a lire. Dans un fichier c'est facile il y a EOF, mais pour une commande système comment le deviner? Donc comme il a été dit sépare les traitements

  14. #14
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 258
    Par défaut
    si ca peut aider, quand j'enlève le p.waitFor(), mon appli fonctionne correctement.

    Rappel du 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
    package test;
     
     
    public class TestCmd {
     
     
    	public TestCmd() {
    		System.out.println("begin");
    		try {
    			Runtime r = Runtime.getRuntime();
    			System.out.println("r="+r);
    			String [] s={"cmd","/c","dir"};
                Process p = r.exec(s);
                System.out.println("p="+p);
                p.getOutputStream().close();
    //            p.waitFor(); si cette ligne est omise, tout fonctionne bien;
    // mais c'est pas propre!
    		}catch(Exception e) {
    			System.out.println("erreur d'execution " ); 
    			e.printStackTrace();
            }		
     
    		System.out.println("fin");
     
    	}
     
    	public static void main(String[] args) {
    		new TestCmd();
    	}
     
    }

  15. #15
    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,


    Lorsque tu lances un Process, il faut traité tous ses flux (input, output et error) dans des threads séparés...

    En effet : ici le programme que tu lances (cmd /K) reste actif et attend des données sur son flux d'entrées, mais comme tu n'écrit rien dedans il reste bloqué en attente de lecture...

    Et si toi tu restes en attente de la fin du process, tu te retrouves en "deadlock" car les deux programmes s'attendent mutuellement...


    lis tous les flux d'E/S (ou fermes les dans le pire des cas).

    a++

    PS : Pour info, je suis en train de développer une classe utilitaire simplifiant l'exécution de Process... je pourrais poster ici lorsqu'elle sera utilisable...

  16. #16
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 258
    Par défaut
    Ouais je veux bien recuperer ton utilitaire.

    N'empeche que lorsque je le mets inactif cmd /c (si c'est bien ce que ca veut dire) , ca ne change rien au problème.

  17. #17
    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
    Citation Envoyé par kenny49
    Ouais je veux bien recuperer ton utilitaire.
    Je rajouterais un lien ici lorsque ce sera publiable

    Citation Envoyé par kenny49
    N'empeche que lorsque je le mets inactif cmd /c (si c'est bien ce que ca veut dire) , ca ne change rien au problème.
    Tu traites bien tous les flux dans des threads séparés ?
    On pourrait voir ton code ?

    a++

  18. #18
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 258
    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
    package test;
     
     
    public class TestCmd {
     
     
    	public TestCmd() {
    		System.out.println("begin");
    		try {
    			Runtime r = Runtime.getRuntime();
    			String [] s={"cmd","/k","dir"};
                Process p = r.exec(s);
                p.getOutputStream().close();
                p.waitFor();
    		}catch(Exception e) {
    			System.out.println("erreur d'execution " ); 
    			e.printStackTrace();
            }		
     
    		System.out.println("fin");
     
    	}
     
    	public static void main(String[] args) {
    		new TestCmd();
    	}
     
    }
    Voila..

  19. #19
    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
    Il faut fermer ou lire tous les flux...

    Ici tu te contentes de fermer le flux d'entrée du programme, mais tu ne lis pas les flux de sorties il y a de forte chances que le buffer de communication entre les deux process soit plein, ce qui bloque le process.

    Et comme ton application est elle aussi bloqué en attente, tu es dans un cas typique de deadlock !


    Il faut fermer ou lire tous les flux...

    a++

  20. #20
    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
    Citation Envoyé par adiGuba
    PS : Pour info, je suis en train de développer une classe utilitaire simplifiant l'exécution de Process... je pourrais poster ici lorsqu'elle sera utilisable...
    Je l'ai posté sur mon blog avec un billet explicatif : Runtime.exec() n'est pas des plus simple...

    a++

Discussions similaires

  1. Probleme de recuperation de données
    Par lilli1407 dans le forum Struts 1
    Réponses: 7
    Dernier message: 26/09/2006, 17h52
  2. [Dates] probleme de recuperation de données
    Par carmen256 dans le forum Langage
    Réponses: 1
    Dernier message: 08/08/2006, 12h43
  3. Probleme de recuperation de données javascript --> formulaire --> php
    Par kowabunga dans le forum Général JavaScript
    Réponses: 20
    Dernier message: 27/07/2006, 10h18
  4. [Tableaux] probleme de recuperation de données
    Par nebil dans le forum Langage
    Réponses: 18
    Dernier message: 07/07/2006, 17h27
  5. [Tableaux] Probleme de recuperation de données
    Par BernardT dans le forum Langage
    Réponses: 14
    Dernier message: 14/11/2005, 23h27

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