Processbuilder
samsam90
Messages postés
9
Statut
Membre
-
KX Messages postés 19031 Statut Modérateur -
KX Messages postés 19031 Statut Modérateur -
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 !!
pleaaaz help
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
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();
}
}