Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么运行进程需要执行getErrorStream()?_Java_Process - Fatal编程技术网

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

Java 为什么运行进程需要执行getErrorStream()?,java,process,Java,Process,我正在使用process类执行一个流程。通过错误流似乎是成功执行流程所必需的。为什么要正确运行进程,必须执行错误流?我做错什么了吗 Process wkstdin = Runtime.getRuntime().exec(command); BufferedWriter wkstdin_writer = new BufferedWriter( new OutputStreamWriter(wkstdin.getOutputStream())); //write data

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

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


很多时候,目标进程将阻塞,直到流被消耗(目标进程的流缓冲区需要排空)。因此,如果您没有处理错误/输出流,则目标进程可能会因其被阻塞而挂起,以便流被排出。

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

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

一些建议:

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

感谢您的澄清!因此,当我使用
getInputStream()
而不是
getErrorStream()
时,我意识到这也不起作用。这是否也取决于进程以及它用来输出数据的流?@Ryan:惯例是程序将其正常输出写入stdout,并将错误诊断信息写入stderr。所以你需要从他们两人身上读到,嗯,我明白了。感谢您的帮助@NathanHughes。目标流程不会主动等待。相反,它试图写入其stdout或stderr,并被阻止,因为连接进程和代码的缓冲区/管道已满。啊,我明白了。谢谢你澄清苏拉杰和斯蒂芬。哦,我没注意到,威尔会在天北做的。