Perhatikan kode berikut:
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);
}
Keluaran program adalah:
/etc:
adduser.co
Ketika saya lari dari shell, tentu saja, ini berfungsi seperti yang diharapkan:
poundifdef@parker:~/rabbit_test$ ls /etc | grep release
lsb-release
Internet memberi tahu saya bahwa, karena perilaku pipa tidak lintas platform, para pemikir brilian yang bekerja di pabrik Jawa yang memproduksi Java tidak dapat menjamin bahwa pipa berfungsi.
Bagaimana saya bisa melakukan ini?
Saya tidak akan melakukan semua parsing saya menggunakan konstruksi Java daripada grepdan sed, karena jika saya ingin mengubah bahasa, saya akan dipaksa untuk menulis ulang kode parsing saya dalam bahasa itu, yang sama sekali tidak boleh digunakan.
Bagaimana saya bisa membuat Java melakukan piping dan redirection saat memanggil perintah shell?
command | grep fooAnda jauh lebih baik dengan hanya menjalankan commanddan melakukan pemfilteran secara native di Java. Itu membuat kode Anda agak lebih kompleks tetapi Anda juga mengurangi konsumsi sumber daya secara keseluruhan dan permukaan serangan secara signifikan.