Processbuilder

Fermé
samsam90 Messages postés 6 Date d'inscription mercredi 22 août 2012 Statut Membre Dernière intervention 31 août 2012 - 22 août 2012 à 13:24
KX Messages postés 16668 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 17 mars 2023 - 22 août 2012 à 14:34
Bonjour,

je suis entrain d'apprendre à utiliser la classe processbuilder

j'arrivre pas à comprendre l'utilité des varibles d'environnements par rapport au aurgumes de la commande de mon application externe

voisi une code je veux comprendre env.put(..) est ce qu'il recupère les arguments si oui est ce qu'il suit un ordre !!





import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.Map.Entry;
 
class AfficheurFlux implements Runnable {
 
    private final InputStream inputStream;
 
    AfficheurFlux(InputStream inputStream) {
        this.inputStream = inputStream;
    }
 
    private BufferedReader getBufferedReader(InputStream is) {
        return new BufferedReader(new InputStreamReader(is));
    }
 
    @Override
    public void run() {
        BufferedReader br = getBufferedReader(inputStream);
        String ligne = "";
        try {
            while ((ligne = br.readLine()) != null) {
                System.out.println(ligne);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 
public class Main {
 
    public static final String CHEMIN = "C:\\workspace\\";
 
    public static void main(String[] args) {
        try {
            ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/C",
                    "HelloWorld.bat");
            pb.directory(new File(CHEMIN));
 
            Map env = pb.environment();
            for (Entry entry : env.entrySet()) {
                System.out.println(entry.getKey() + " : " + entry.getValue());
            }
 
            env.put("MonArg", "Valeur");
 
            Process p = pb.start();
            AfficheurFlux fluxSortie = new AfficheurFlux(p.getInputStream());
            AfficheurFlux fluxErreur = new AfficheurFlux(p.getErrorStream());
            new Thread(fluxSortie).start();
            new Thread(fluxErreur).start();
            p.waitFor();
 
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


pleaaaz help

1 réponse

KX Messages postés 16668 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 17 mars 2023 3 004
22 août 2012 à 14:34
La méthode "put" agit sur l'environnement comme la commande "set" sous Windows, et décrite dans l'article variable d'environnement.

Donc non, il n'y a pas d'ordre dans les variables d'environnement, puisqu'il y a une association clé/valeur, contrairement aux arguments de la commande qui ont une association indice/valeur.

Au passage, quelques remarques dans ton code :

1) AfficheurFlux implémente Runnable et tu l'utilises ensuite comme paramètre d'un thread, autant directement hérité de la classe thread !
2) Tu aurais intérêt à utiliser Scanner plutôt que BufferedReader car c'st plus simple...
3) Il serait cohérent de différencier getInputStream() et getErrorStream() en affichant le premier avec System.out et le deuxième avec System.err
4) Plutôt que d'exécuter "cmd.exe /C HelloWorld.bat", tu peux directement exécuter "HelloWorld.bat", ça évitera d'avoir à passer par un programme système Windows, tu pourras ainsi utiliser le même programme Java sous Linux par exemple.
5) Il faut préciser les types manipuler dans les Map sinon tu ne peux pas utiliser ta boucle foreach sur les Entry.
6) Plutôt que de faire des concaténations de String dans un println, tu peux utiliser printf, de plus les ":" sont ambigües car certaines valeurs des variables d'environnement les contiennent...
7) Il serait mieux d'afficher l'environnement avant et après l'ajout, pour voir la différence.

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
 
class AfficheurFlux extends Thread
{
    private final InputStream in;
    private final PrintStream out;
    
    AfficheurFlux(InputStream inputStream, PrintStream outputStream) 
    {
        in = inputStream;
        out = outputStream;
    }
    
    @Override
    public void run()
    {
        Scanner sc = new Scanner(in);
        while (sc.hasNextLine())
        	out.println(sc.nextLine());
        sc.close();
    }
}

public class Main
{
    public static final String CHEMIN = "C:\\workspace";
 
    private static void afficher(Map<String,String> map)
    {
    	System.out.print("########");
    	
        for (Entry<String,String> entry : map.entrySet())
        	System.out.printf("\n%s\n%s\n",entry.getKey(),entry.getValue());
        
    	System.out.println("########");
    }
    
    public static void main(String[] args) throws IOException, InterruptedException
    {
    	ProcessBuilder pb = new ProcessBuilder("C:\\workspace\\HelloWorld.cmd");
 
        afficher(pb.environment());                
        pb.environment().put("MonArg", "Valeur");
        afficher(pb.environment());
 
        Process p = pb.start();
        Thread out = new AfficheurFlux(p.getInputStream(),System.out);
        Thread err = new AfficheurFlux(p.getErrorStream(),System.err);
        
        p.waitFor();
        out.start();
        err.start();
    }
}
2