Considérez le code suivant:
String commandf = "ls /etc | grep release";
try {
// Execute the command and wait for it to complete
Process child = Runtime.getRuntime().exec(commandf);
child.waitFor();
// Print the first 16 bytes of its output
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 cours depuis le shell, bien sûr, cela fonctionne comme prévu:
poundifdef@parker:~/rabbit_test$ ls /etc | grep release
lsb-release
Les internets me disent que, étant donné que le comportement des tuyaux n'est pas multiplateforme, les esprits brillants qui travaillent dans l'usine Java produisant Java ne peuvent pas garantir que les tuyaux fonctionnent.
Comment puis-je faire ceci?
Je ne vais pas faire tout mon analyse en utilisant des constructions Java plutôt que grep
et sed
, parce que si je veux changer de langage, je serai obligé de réécrire mon code d'analyse dans ce langage, ce qui est totalement interdit.
Comment puis-je faire en sorte que Java effectue le piping et la redirection lors de l'appel de commandes shell?
command | grep foo
vous êtes beaucoup mieux avec juste d'exécuter command
et de filtrer nativement en Java. Cela rend votre code un peu plus complexe, mais vous réduisez également considérablement la consommation globale de ressources et la surface d'attaque.