Hãy xem xét đoạn mã sau:
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);
}
Đầu ra của chương trình là:
/etc:
adduser.co
Tất nhiên, khi tôi chạy từ shell, nó hoạt động như mong đợi:
poundifdef@parker:~/rabbit_test$ ls /etc | grep release
lsb-release
Các internets nói với tôi rằng, do hành vi của pipe không phải là đa nền tảng, những bộ óc xuất sắc làm việc trong nhà máy Java sản xuất Java không thể đảm bảo rằng pipe hoạt động.
Tôi có thể làm cái này như thế nào?
Tôi sẽ không thực hiện tất cả quá trình phân tích cú pháp của mình bằng cách sử dụng các cấu trúc Java thay vì grep
và sed
, bởi vì nếu tôi muốn thay đổi ngôn ngữ, tôi sẽ buộc phải viết lại mã phân tích cú pháp của mình bằng ngôn ngữ đó, điều này hoàn toàn không nên.
Làm cách nào tôi có thể làm cho Java thực hiện đường ống và chuyển hướng khi gọi các lệnh shell?
command | grep foo
bạn sẽ tốt hơn nhiều chỉ cần chạy command
và thực hiện lọc nguyên bản trong Java. Nó làm cho mã của bạn phức tạp hơn một chút nhưng bạn cũng giảm đáng kể mức tiêu thụ tài nguyên và bề mặt tấn công.