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
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
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
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.
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();
}
}