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

What is the difference between different ProcessBuilder.redirectInput()?

我浏览了 ProcessBuilder 的文档,但我无法理解

之间的区别
  1. processBuiler.inheritIO()
  2. processBuilder.redirectInput(ProcessBuilder.Redirect.PIPE)
  3. processBuilder.redirectInput(ProcessBuilder.Redirect.INHERIT)

FROM DOC: ProcessBuilder.Redirect PIPE: Indicates that subprocess I/O will be connected to the current Java process over a pipe. This is the default handling of subprocess standard I/O.

  1. 这里的管道是什么?

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

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

如果这个问题不适合 Whosebug,请指出正确的方向,告诉我在哪里问这个问题。

PIPE 表示进程的 I/O 流可通过 Process#getInputStreamProcess#getErrorStreamProcess#getOutputStream 获得。这与INHERIT不同,它将流与当前Java进程的流合并,即System.outSystem.inSystem.err

当您调用 ProcessBuilder#inheritIO 时,您会将所有 I/O 流重定向到 System

当您调用 redirectInput(ProcessBuilder.Redirect.PIPE) 时,您只是将输入重定向到 PIPE

当您调用 redirectInput(ProcessBuilder.Redirect.INHERIT) 时,您只是将输入重定向到 System

因此,1st 和 3d 之间的区别在于 3d 调用仅重定向进程的输入,而 1st 重定向所有 I/O 流。

当您想通过 System.

的流使用 Process 的流时,您应该使用 INHERIT

当你想单独处理流程流时,你应该使用 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();

    }
}