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 :

Résutat d'une commande en Java


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 74
    Par défaut Résutat d'une commande en Java
    Bonjour,
    Je développe une application en java dans laquelle j’exécute la commande suivate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rsh site -l user sqlplus rep/rep@DataBase @paramgen.
    avec Runtime.exec. Mais le problème est que le processus créer envoie la valeur 1 et je n'ai pas de retour de ma commande. Quand j’exécute en ligne de commande tout va bien. Merci pour toute suggestion.

  2. #2
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Par défaut
    Utilise la classe ProcessBuilder pour lancer ta commande avec quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ProcessBuilder processBuilder = new ProcessBuilder("rm", "-f", "*");
    Process process = processBuilder.start();
    OutputStream oStream = process.getOutputStream();
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  3. #3
    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
    On pourrait voir le code aussi?

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 74
    Par défaut
    Voici le 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
    32
    33
    34
    35
    36
    37
    Runtime rt2 = Runtime.getRuntime();
    try{
     
        	proc2 = rt2.exec("rsh "+site+" -l user sqlplus rep/rep@DataBase @paramgen");
     
        }catch(IOException ex){
          System.out.println("une erreure s'est produit ");
          ex.printStackTrace();
        }
    DataInputStream in = null;
        try{  
          in = new DataInputStream(proc2.getInputStream());
          BufferedReader buf = new BufferedReader(new InputStreamReader(in));
          String st = buf.readLine();
     
          while(st != null){
            fic.write(st+"\n");
            System.out.println(st);
            st = buf.readLine();
          }
     
        }catch(IOException ex){
          ex.printStackTrace();
        }
     
    try{
          in.close();	
          fic.close();
        }catch(IOException ex){
          ex.printStackTrace();
        }
    try{
          str = proc2.exitValue();
          System.out.println("la cmd à ete bien execute avec la valeur "+str);
        }catch(IllegalThreadStateException ex){
          System.out.println("la cmd est mal termine");
        }
    à l'exécution j'ai ceci "la cmd à ete bien execute avec la valeur 1"

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


    Une valeur de retour supérieur à 0 indique généralement une erreur...


    Mais bon ton code a un grand nombre de défaut, voir d'erreur :
    • Il est préférable de séparer les paramètres de la commande, via un tableau. D'ailleurs il faudrait privilégier ProcessBuilder à la place de Runtime.exec() !
    • Tu ne traites pas le flux d'erreur (du coup tu dois passer à coté des messages d'erreurs), et tu ne traites pas le flux d'entrée.
      Il faut impérativement les traiter (en parallèle) ou fermer ces flux, sous peine d'interblocage entre les deux programmes !
    • La gestion des exceptions est exécrable : plein de bloc catch qui se contente d'afficher un message et de continuer le traitement !?!?
      Du style tu n'arrives pas à lancer le process, mais tu tentes quand même de lire son résultat !?!?
      Le bloc try/catch devrait contenir tout ton code. Une erreur arrêtant tout le traitement. C'est inutile de vouloir continuer après une erreur...
    • Il manque les try/finally pour les close()... (si j'avais eu 1 € à chaque fois que j'ai dit cela je serait riche !)
    • A quoi sert le DataInputStream ? Tout comme les Readers !?!? Si tu veux simplement copier le tout dans un fichier autant le faire directement via un buffer de byte. C'est plus simple et plus performant (pas de conversion inutile en char).



    A noter qu'avec ProcessBuilder tu peux regrouper les flux standard et d'erreur, ce qui permet de n'en lire qu'un seul et de ne pas s'embêter à paralléliser tout cela


    Quelque chose comme cela serait déjà plus correcte :
    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
    		// On utilise ProcessBuilder, et on passe chaque paramètre indépendammment :
    		ProcessBuilder pb = new ProcessBuilder(
    				"rsh", site, "-l", "user", "sqlplus",
    				"rep/rep@DataBase", "@paramgen");
    		// On redirige le flux d'erreur dans le flux standard
    		// (pour pas s'embêter à traiter les deux en parallèle)
    		pb.redirectErrorStream(true);
     
    		// On crée le process :
    		Process process = pb.start();
    		try {
    			// On ferme les flux inutilisés :
    			process.getOutputStream().close(); // on n'a pas besoin d'écrire
    			process.getErrorStream().close(); // il est redirigé
     
    			// On lit le flux principal
    			InputStream input = process.getInputStream();
    			try {
    				// Ouverture du fichier
    				FileOutputStream output = new FileOutputStream("file.txt");
    				try {
    					// Copie par buffer :
    					byte[] buf = new byte[8192];
    					int len;
    					while ( (len=input.read(buf)) >= 0) {
    						output.write(buf, 0, len);
    					}
    					output.flush();
    				} finally {
    					// fermeture du flux
    					output.close();
    				}
    			} finally {
    				// fermeture du flux
    				input.close();
    			}
     
    			int result = process.waitFor();
     
    		} finally {
    			// garde-fou : on détruit le process en cas de problème
    			/// il devrait déjà être terminée dans une exécution normale
    			process.destroy();
    		}

    a++

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 74
    Par défaut
    Merci pour tes remarques, je sais maintenant où se trouve mon erreur. En redirigeant le flux d'erreur sur la sortie standard.

Discussions similaires

  1. Parcourir un résultat d'une commande avec Java StringBuffer
    Par cisco.nat dans le forum Général Java
    Réponses: 2
    Dernier message: 29/05/2013, 11h09
  2. Réponses: 2
    Dernier message: 15/12/2007, 16h52
  3. faire tourner une commande dos sous application java
    Par Terminator dans le forum API standards et tierces
    Réponses: 22
    Dernier message: 02/05/2006, 22h33
  4. Problème d'encodage d'une commande lancée par java
    Par Pointu dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 29/04/2006, 00h35
  5. [débutant]lancement d'une commande Unix ou LInux depuis Java
    Par msiramy dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 30/09/2005, 18h10

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