Considérez le code suivant :
String commandf = "ls /etc | grep release";
try {
// Exécuter la commande et attendre sa fin
Process child = Runtime.getRuntime().exec(commandf);
child.waitFor();
// Imprimer les 16 premiers octets de sa sortie
InputStream i = child.getInputStream();
byte[] b = new byte[16];
i.read(b, 0, b.length);
System.out.println(new String(b));
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
La sortie du programme est :
/etc:
adduser.co
Lorsque je l'exécute à partir du shell, bien sûr, cela fonctionne comme prévu :
poundifdef@parker:~/rabbit_test$ ls /etc | grep release
lsb-release
Les internautes me disent que, en raison du fait que le comportement des pàipes n'est pas interplateforme, les brillants esprits qui travaillent dans l'usine Java produisant Java ne peuvent garantir que les pàipes fonctionnent.
Comment puis-je faire cela ?
Je ne vais pas faire tout mon parsing en utilisant des constructions Java plutôt que grep
et sed
, car si je veux changer de langage, je serai obligé de réécrire mon code d'analyse dans ce langage, ce qui est totalement inacceptable.
Comment puis-je faire en sorte que Java utilise les pàipes et les redirections lors de l'appel de commandes shell ?
0 votes
Je le vois ainsi: Si vous le faites avec la manipulation de chaînes Java natives, vous êtes garanti de pouvoir rendre l'application Java portable sur toutes les plateformes prises en charge par Java. D'un autre côté, si vous le faites avec des commandes shell, il est plus facile de changer la langue de Java, mais cela ne fonctionnera que lorsque vous êtes sur une plate-forme POSIX. Peu de gens changent la langue de l'application plutôt que la plate-forme sur laquelle l'application s'exécute. C'est pourquoi je trouve votre raisonnement un peu curieux.
0 votes
Dans le cas spécifique de quelque chose de simple comme
commande | grep foo
, il est préférable d'exécuter simplementcommande
et de filtrer nativement en Java. Cela rend votre code un peu plus complexe, mais vous réduisez également de manière significative la consommation de ressources globale et la surface d'attaque.