Considera il codice seguente:
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);
}
L'output del programma è:
/etc:
adduser.co
Quando corro dalla shell, ovviamente, funziona come previsto:
poundifdef@parker:~/rabbit_test$ ls /etc | grep release
lsb-release
Internet mi dice che, poiché il comportamento delle pipe non è multipiattaforma, le menti brillanti che lavorano nella fabbrica Java che produce Java non possono garantire che le pipe funzionino.
Come posso fare questo?
Non ho intenzione di eseguire tutta la mia analisi utilizzando costrutti Java anziché grep
esed
, poiché se voglio cambiare la lingua, sarò costretto a riscrivere il mio codice di analisi in quella lingua, il che è totalmente vietato.
Come posso fare in modo che Java esegua piping e reindirizzamento quando si richiamano i comandi della shell?
command | grep foo
te, stai molto meglio solo eseguendo command
e facendo il filtro in modo nativo in Java. Rende il tuo codice un po 'più complesso ma riduci anche il consumo complessivo di risorse e la superficie di attacco in modo significativo.