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 grep
dan 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 foo
Anda jauh lebih baik dengan hanya menjalankan command
dan 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.