Considere el siguiente 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);
}
La salida del programa es:
/etc:
adduser.co
Cuando corro desde el shell, por supuesto, funciona como se esperaba:
poundifdef@parker:~/rabbit_test$ ls /etc | grep release
lsb-release
Los internets me dicen que, debido al hecho de que el comportamiento de las tuberías no es multiplataforma, las mentes brillantes que trabajan en la fábrica de Java que produce Java no pueden garantizar que las tuberías funcionen.
¿Cómo puedo hacer esto?
No voy a hacer todo mi análisis utilizando construcciones de Java en lugar de grep
y sed
, porque si quiero cambiar el idioma, me veré obligado a volver a escribir mi código de análisis en ese idioma, lo cual es totalmente prohibido.
¿Cómo puedo hacer que Java realice la canalización y la redirección al llamar a comandos de shell?
command | grep foo
, es mucho mejor ejecutar command
y filtrar de forma nativa en Java. Hace que su código sea algo más complejo, pero también reduce significativamente el consumo general de recursos y la superficie de ataque.