2013-04-07 34 views
0

我用processbuilder fork了一個子進程,並且我想要得到子進程的輸出。因此我使用getInputStream進程來獲取子進程的輸出。我發現父進程只能讀取子進程的輸出子流程的子流程出口或Std.out關閉。Jave進程從子進程getInputStream

子流程的System.out.flush()不起作用。

但我需要得到很多次的輸出。我怎麼能在這個場合呢?

回答

2

如果沒有看到您的代碼,並且確切知道您的子進程中具體是什麼,則很難提供幫助。下面是一個適用於我的示例,其中子流程輸出文本,等待三秒鐘,然後打印出更多文本。在我的機器上(Windows XP上的Java 6),我看到了初始文本,暫停和剩餘文本 - 所有這些都在子進程退出之前完成。

import java.io.BufferedReader; 
import java.io.File; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.Reader; 


public class TestProcessBuilder 
{ 
    public static void main(String args[]) 
    { 
     try 
     { 
      String threeCommands[] = 
       { "cmd", "/c", 
        "dir", // prints out text 
        "&&", 
        "ping", "127.0.0.1", "-n", "3", ">", "nul", // waits 3 seconds 
        "&&", 
        "dir" // prints out more text 
       }; 
      ProcessBuilder builder = new ProcessBuilder(threeCommands); 
      builder.directory(new File("C://")); 
      builder.redirectErrorStream(); 

      Process subProcess = builder.start(); 

      // this reads from the subprocess's output stream 
      BufferedReader subProcessInputReader = 
       new BufferedReader(new InputStreamReader(subProcess.getInputStream())); 

      String line = null; 
      while ((line = subProcessInputReader.readLine()) != null) 
       System.out.println(line); 

      subProcessInputReader.close(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

謝謝您answer.Now我已經改變輸出到一個臨時文件,但我真的想知道如何做兩個流連接together.I認爲父進程無法訪問子進程的內存所以兩個進程之間的通信是由OS支持的,那麼子進程會將它的數據輸出到由OS分配的內存區域中,然後父進程會從內存中讀取它。我很好奇它是如何工作的。 – user1749075 2013-04-08 08:35:10