为什么要运行进程需要getErrorStream()?

时间:2012-06-11 14:21:51

标签: java process

我正在使用Process类执行进程。通过错误流似乎有必要成功执行该过程。为什么要经历错误流以使进程正常运行?有什么我做错了吗?

Process wkstdin = Runtime.getRuntime().exec(command);
BufferedWriter wkstdin_writer = new BufferedWriter(
            new OutputStreamWriter(wkstdin.getOutputStream()));
//write data

守则的必要部分:

BufferedReader input = new BufferedReader(new InputStreamReader(
            wkstdin.getErrorStream()));
String ch;
while ((ch = input.readLine()) != null)
{
  System.out.println(ch);
}

2 个答案:

答案 0 :(得分:5)

当进程写入stderr时,输出将转到固定大小的缓冲区。如果缓冲区填满,则进程将阻塞,直到缓冲区中剩余输出有空间。因此,如果缓冲区未清空,则进程将挂起。

如果您想了解它的过程出现问题,错误流可能包含实际有用的信息。

一些建议:

  • 命名一个字符串ch似乎有误导性,因为ch通常用于字符。
  • 我喜欢将从stderr读取的代码放在专用的工作线程中。这样,在读取输入流和错误流之间切换就会自动发生,而不必考虑它。

答案 1 :(得分:2)

这实际上取决于您正在执行的目标进程。

目标进程很多次会阻止直到消耗流(目标进程的流缓冲区需要耗尽)。因此,如果您没有处理错误/输出流,那么目标进程可能会被挂起,因为它被阻塞以便流消耗。