Considere o seguinte código:
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);
}
O resultado do programa é:
/etc:
adduser.co
Quando executo a partir do shell, é claro, funciona conforme o esperado:
poundifdef@parker:~/rabbit_test$ ls /etc | grep release
lsb-release
As internets me dizem que, devido ao fato de que o comportamento do pipe não é multiplataforma, as mentes brilhantes que trabalham na fábrica Java produzindo Java não podem garantir que o pipe funcione.
Como posso fazer isso?
Não vou fazer toda a minha análise usando construções Java em vez de grep
e sed
, porque se eu quiser alterar a linguagem, serei forçado a reescrever meu código de análise nessa linguagem, o que é totalmente impossível.
Como posso fazer o Java fazer piping e redirecionamento ao chamar comandos shell?
command | grep foo
você, é muito melhor apenas executar command
e filtrar nativamente em Java. Isso torna seu código um pouco mais complexo, mas também reduz significativamente o consumo geral de recursos e a superfície de ataque.