2013-04-07 36 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