Betrachten Sie den folgenden Code:
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);
}
Die Ausgabe des Programms ist:
/etc:
adduser.co
Wenn ich von der Shell aus laufe, funktioniert es natürlich wie erwartet:
poundifdef@parker:~/rabbit_test$ ls /etc | grep release
lsb-release
Die Internetseiten sagen mir, dass die brillanten Köpfe, die in der Java-Fabrik arbeiten, die Java produziert, aufgrund der Tatsache, dass das Pipe-Verhalten nicht plattformübergreifend ist, nicht garantieren können, dass Pipes funktionieren.
Wie kann ich das machen?
Ich werde nicht das gesamte Parsen mit Java-Konstrukten durchführen und nicht, grep
und sed
wenn ich die Sprache ändern möchte, muss ich meinen Parsing-Code in dieser Sprache neu schreiben, was absolut unmöglich ist.
Wie kann ich Java dazu bringen, beim Aufrufen von Shell-Befehlen Piping und Umleitung durchzuführen?
command | grep foo
Ihnen ist es viel besser, wenn Sie nur command
die Filterung nativ in Java ausführen und durchführen. Dies macht Ihren Code etwas komplexer, aber Sie reduzieren auch den Gesamtressourcenverbrauch und die Angriffsfläche erheblich.