4

我正在使用 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);
}
4

2 回答 2

6

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

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

一些建议:

  • 命名字符串 ch 似乎具有误导性,因为 ch 通常用于字符。
  • 我喜欢将从 stderr 读取的代码放在专用的工作线程中。这样,读取输入流和错误流之间的切换会自动发生,而无需我允许。
于 2012-06-11T14:28:23.547 回答
2

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

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

于 2012-06-11T14:24:38.167 回答