我浏览了ProcessBuilder的文档,但在理解之间的区别时遇到了困难
FROM DOC:ProcessBuilder.Redirect PIPE: 指示子进程I / O将通过管道连接到当前Java进程。这是子流程标准I / O的默认处理。
这里是什么管道?
您何时何地使用它们中的每一个?
根据文档,那么1和3之间的区别是什么?
如果此问题不适合stackoverflow,请向我指出正确的方向。
PIPE
表示将通过Process#getInputStream
,Process#getErrorStream
和Process#getOutputStream
获得该过程的I / O流。这与INHERIT
不同,后者将流与当前Java进程的流(即System.out
,System.in
或System.err
)合并。
当您调用ProcessBuilder#inheritIO
时,您正在将所有I / O流重定向到System
。
当您调用redirectInput(ProcessBuilder.Redirect.PIPE)
时,您仅将输入重定向到PIPE
。
当您调用redirectInput(ProcessBuilder.Redirect.INHERIT)
时,您仅将输入重定向到System
。
因此,第1d和3d之间的区别是3d调用仅重定向过程的输入,而第1d则重定向所有I / O流。
[当您想通过INHERIT
的流使用处理流时,应使用System
。
并且当您要分别处理流程流时,应使用PIPE
。考虑以下示例:
public class ProcessTest {
@Test
public void testProcess() throws IOException {
//all streams go to System streams
new ProcessBuilder("java","--version").inheritIO().start();
//all streams are kept separate, and are obtained via .get...Stream() calls
Process process2=new ProcessBuilder("java","--version").start();
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(process2.getInputStream()));
String s;
while ((s=bufferedReader.readLine())!=null)
{
System.out.println(s);
}
bufferedReader.close();
//only the output of the Process is going to the System.out
new ProcessBuilder("java","--version").redirectOutput(ProcessBuilder.Redirect.INHERIT).start();
}
}