พิจารณารหัสต่อไปนี้:
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);
}
ผลลัพธ์ของโปรแกรมคือ:
/etc:
adduser.co
แน่นอนว่าเมื่อฉันเรียกใช้จากเชลล์มันทำงานได้ตามที่คาดไว้:
poundifdef@parker:~/rabbit_test$ ls /etc | grep release
lsb-release
ผู้ฝึกงานบอกฉันว่าเนื่องจากพฤติกรรมของท่อไม่ใช่การข้ามแพลตฟอร์มจิตใจที่ยอดเยี่ยมที่ทำงานในโรงงาน Java ที่ผลิต Java ไม่สามารถรับประกันได้ว่าไปป์ทำงานได้
ฉันจะทำเช่นนี้ได้อย่างไร?
ฉันจะไม่ทำการแยกวิเคราะห์ทั้งหมดของฉันโดยใช้โครงสร้าง Java มากกว่าgrep
และsed
เพราะถ้าฉันต้องการเปลี่ยนภาษาฉันจะถูกบังคับให้เขียนรหัสการแยกวิเคราะห์ของฉันใหม่ในภาษานั้นซึ่งไม่ต้องทำเลย
ฉันจะทำให้ Java ทำการไพพ์และการเปลี่ยนเส้นทางเมื่อเรียกคำสั่งเชลล์ได้อย่างไร