2013-04-21 156 views
16

我想將java進程輸出重定向到父進程的標準輸出。ProcessBuilder重定向到標準輸出

使用的ProcessBuilder類,如下所示:

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); 
} 

我本來預計, 「CMD」,這是一樣的輸出:

的Microsoft Windows [版本6.1.7601] 版權所有(C )2009年微軟公司。 Tous droitsréservés。

顯示在用於運行java程序的DOS控制檯中。 但是在DOS控制檯中什麼也沒有顯示。

在討論的其他討論中,我看到了使用BufferedReader類的解決方案:但是在這裏,我希望過程的輸出直接顯示在標準輸出中,而不使用任何BufferedReader或「while reading loop」。可能嗎?

謝謝。

+3

看看爲你需要的方法的系統類的API:'放樣(...)','SETIN(...)','setErr (...)'。 – 2013-04-21 18:47:11

+0

這應該工作。我不明白爲什麼它不會。 – Qix 2013-07-23 13:24:21

回答

11

你確實錯過了一個關鍵部分,你實際上需要開始你的過程並等待你的輸出。我相信這會起作用,

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

應該被接受回答@Elliott Frisch – gumuruh 2016-07-14 07:28:09

12

嘗試ProcessBuilder.inheritIO()使用與當前Java進程相同的I/O。另外,您可以daisy chain方法:

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

只有一個腳註提供了我自己的信息 - 如果您過了一會兒再打電話給'pb.destroy()',您將不會得到任何打印內容(即使您調用'System.out.flush() '); – 2015-10-07 19:00:37