不同的ProcessBuilder.redirectInput()有什么区别?
What is the difference between different ProcessBuilder.redirectInput()?
我浏览了 ProcessBuilder 的文档,但我无法理解
之间的区别
- processBuiler.inheritIO()
- processBuilder.redirectInput(ProcessBuilder.Redirect.PIPE)
- 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 和 3 之间的区别是什么?
如果这个问题不适合 Whosebug,请指出正确的方向,告诉我在哪里问这个问题。
PIPE
表示进程的 I/O 流可通过 Process#getInputStream
、Process#getErrorStream
和 Process#getOutputStream
获得。这与INHERIT
不同,它将流与当前Java进程的流合并,即System.out
、System.in
或System.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();
}
}
我浏览了 ProcessBuilder 的文档,但我无法理解
之间的区别- processBuiler.inheritIO()
- processBuilder.redirectInput(ProcessBuilder.Redirect.PIPE)
- 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 和 3 之间的区别是什么?
如果这个问题不适合 Whosebug,请指出正确的方向,告诉我在哪里问这个问题。
PIPE
表示进程的 I/O 流可通过 Process#getInputStream
、Process#getErrorStream
和 Process#getOutputStream
获得。这与INHERIT
不同,它将流与当前Java进程的流合并,即System.out
、System.in
或System.err
。
当您调用 ProcessBuilder#inheritIO
时,您会将所有 I/O 流重定向到 System
。
当您调用 redirectInput(ProcessBuilder.Redirect.PIPE)
时,您只是将输入重定向到 PIPE
。
当您调用 redirectInput(ProcessBuilder.Redirect.INHERIT)
时,您只是将输入重定向到 System
。
因此,1st 和 3d 之间的区别在于 3d 调用仅重定向进程的输入,而 1st 重定向所有 I/O 流。
当您想通过 System
.
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();
}
}