Java Process无法获取ErrorStream消息

时间:2012-11-22 16:54:01

标签: java

每个人,我有一个需要从子进程获得标准输出和日志/错误/异常输出的进程。标准输出很好,但我无法获得ErrorStream,因此程序因此而停留在那里。这是我的简单代码。什么都没有魔力,但为什么我不能在这里得到错误流?谢谢你看。

    BufferedReader standard =
         new BufferedReader(new InputStreamReader(process.getInputStream()));

   BufferedReader error = 
   new BufferedReader(new InputStreamReader(process.getErrorStream()));

    String line = null;
    while ((line = standard.readLine()) != null) {            
        System.out.println(line);
    }
    while ((line = error.readLine()) != null) {           
        System.out.println(line);
    }

现在,正如所建议的那样,我使用了两个线程来处理输出和错误流,但仍然存在同样的问题,如下所示。有人能给我一些见解吗?感谢。

    ProcessBuilder pb = new ProcessBuilder(listArgs);
    pb.redirectErrorStream();
    Process process = pb.start();

    StreamThread output = new StreamThread(process.getInputStream());
    StreamThread error = new StreamThread(process.getErrorStream());

    output.start();
    error.start();
    while (true) {
        try {
            output.join();
            break;
        }
        catch (InterruptedException ie) {
            ie.printStackTrace();
        }
    }

StreamThread的定义:

    public static class StreamThread extends Thread{
    private InputStream input = null;   
    public StreamThread(InputStream in){
        input = in;
    }       
    String line = null;
    public void start(){            
        BufferedReader reader = new BufferedReader(new InputStreamReader(input));           
        try{
            while( (line=reader.readLine()) != null ){
                System.out.println(line);
            }
            reader.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

看看你的循环:

while ((line = standard.readLine()) != null) {            
    System.out.println(line);
}
while ((line = error.readLine()) != null) {           
    System.out.println(line);
}

您将继续读取输出流,直到它完成 - 这可能是在流程终止时。只有然后才开始阅读错误流。

您可能应该将其中至少一个放入不同的线程中,这样您就可以同时读取两个流。