每个人,我有一个需要从子进程获得标准输出和日志/错误/异常输出的进程。标准输出很好,但我无法获得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();
}
}
}
答案 0 :(得分:1)
看看你的循环:
while ((line = standard.readLine()) != null) {
System.out.println(line);
}
while ((line = error.readLine()) != null) {
System.out.println(line);
}
您将继续读取输出流,直到它完成 - 这可能是在流程终止时。只有然后才开始阅读错误流。
您可能应该将其中至少一个放入不同的线程中,这样您就可以同时读取两个流。