2013-04-21 21 views
16

Tôi muốn chuyển hướng một đầu ra quá trình java hướng tới đầu ra tiêu chuẩn của quá trình cha mẹ java.ProcessBuilder được chuyển hướng đến đầu ra tiêu chuẩn

Sử dụng lớp ProcessBuilder như sau:

public static void main(String[] args) { 
    ProcessBuilder processBuilder = new ProcessBuilder("cmd"); 
    processBuilder.directory(new File("C:")); 
    processBuilder.redirectErrorStream(true); // redirect error stream to output stream 
    processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT); 
} 

tôi lại có thể ngờ rằng kết quả của "cmd", mà là giống như:

Microsoft Windows [phiên bản 6.1.7601] Copyright (c) Tổng công ty Microsoft 2009. Tous làm réservés.

được hiển thị trong bảng điều khiển DOS được sử dụng để chạy chương trình java. Nhưng không có gì được hiển thị ở tất cả trong DOS Console. Trong các chủ đề thảo luận khác, tôi thấy các giải pháp sử dụng một lớp BufferedReader: nhưng ở đây tôi muốn các đầu ra của quá trình được hiển thị trực tiếp trong đầu ra tiêu chuẩn, mà không sử dụng bất kỳ BufferedReader hoặc "trong khi đọc vòng lặp". Có thể không?

Cảm ơn.

+3

Nhìn vào các API cho các lớp hệ thống cho các phương pháp mà bạn sẽ cần: 'setOut (...)', 'setIn (...)', 'setErr (...) '. –

+0

Điều đó sẽ hoạt động. Tôi không hiểu tại sao nó lại không. – Qix

Trả lời

11

Bạn đã bỏ lỡ một phần quan trọng, bạn thực sự cần phải bắt đầu quá trình của bạn và chờ cho đầu ra của bạn. Tôi tin rằng điều này sẽ hoạt động,

processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT); 
// Start the process. 
try { 
    Process p = processBuilder.start(); 
    // wait for termination. 
    p.waitFor(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
+2

nên được chấp nhận trả lời @Elliott Frisch – gumuruh

12

Hãy dùng ProcessBuilder.inheritIO() để sử dụng cùng một I/O như quy trình Java hiện tại. Thêm vào đó bạn có thể daisy chain các phương pháp:

ProcessBuilder pb = new ProcessBuilder("cmd") 
    .inheritIO() 
    .directory(new File("C:")); 
pb.start(); 
+3

Chỉ cần một chú thích cho thông tin của riêng tôi - nếu bạn gọi 'pb.destroy()' quá sớm sau đó bạn sẽ không nhận được bất kỳ thứ gì được in (ngay cả khi bạn gọi 'System.out.flush() '); –