1

大家,我有一个进程需要从子进程中获取标准输出和日志/错误/异常输出。标准输出很好,但我无法获得 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();
        }
    }
}
4

1 回答 1

2

看看你的循环:

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

您将继续从输出流中读取,直到它完成 - 这很可能是进程终止的时候。只有这样你才开始阅读错误流。

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

于 2012-11-22T16:56:36.037 回答