不同ProcessBuilder.redirectInput()之间有什么区别?

问题描述 投票:0回答:1

我浏览了ProcessBuilder的文档,但在理解之间的区别时遇到了困难

  1. processBuiler.inheritIO()
  2. processBuilder.redirectInput(ProcessBuilder.Redirect.PIPE)
  3. processBuilder.redirectInput(ProcessBuilder.Redirect.INHERIT)

FROM DOC:ProcessBuilder.Redirect PIPE: 指示子进程I / O将通过管道连接到当前Java进程。这是子流程标准I / O的默认处理。

  1. 这里是什么管道?

  2. 您何时何地使用它们中的每一个?

  3. 根据文档,那么1和3之间的区别是什么?

如果此问题不适合stackoverflow,请向我指出正确的方向。

java process processbuilder
1个回答
1
投票

PIPE表示将通过Process#getInputStreamProcess#getErrorStreamProcess#getOutputStream获得该过程的I / O流。这与INHERIT不同,后者将流与当前Java进程的流(即System.outSystem.inSystem.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();

    }
}
    
© www.soinside.com 2019 - 2024. All rights reserved.