使用Java中的ProcessBuilder将进程的输出重定向到另一个进程的输入

我有两个由processBuilders定义的进程:

ProcessBuilder pb1 = new ProcessBuilder (...) ProcessBuilder pb2 = new ProcessBuilder (...) 

我希望pb1的输出成为pb1的输入。 我在文档中发现我可以通过使用管道从另一个进程读取pb2的输入:

 pb2.redirectInput(Redirect.PIPE); 

但是,如何指定我希望此管道从pb1的输出中pb1

static ProcessBuilder.Redirect INHERIT指示子进程I / O源或目标将与当前进程的相同。

static ProcessBuilder.Redirect PIPE指示子进程I / O将通过管道连接到当前Java进程。

所以我认为其中一个不会帮助您将一个进程的输出重定向到另一个进程的输入。

所以让我们弄脏手写一些代码。 相关的是

 RedirectStreams redirectStreams = new RedirectStreams(process1,process2); 

进程I / O启动时带有重定向的线程。 测试方法的其余部分仅用于演示。 对于进程,我启动bash并通过echo命令输出。 因此,对于此特定示例,我嵌套了echo命令。

echo Foo

回声回声

回声

 public class ProcessPipeTest { @Test public void testPipe(){ try { Process process1 = new ProcessBuilder("/bin/bash").start(); Process process2 = new ProcessBuilder("/bin/bash").start(); RedirectStreams redirectStreams = new RedirectStreams(process1,process2); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(process1.getOutputStream())); String command = "echo echo echo"; System.out.println("Input process1: " + command); bufferedWriter.write(command + '\n'); bufferedWriter.close(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process2.getInputStream())); String actualOutput = bufferedReader.readLine(); System.out.println("Output process2: " + actualOutput); assertEquals("echo",actualOutput); } catch (IOException e) { e.printStackTrace(); } } } 

在这里RedirectStreams类,这个可以肯定设计得更好,我没有测试,如果它运行安全,但它完成了工作。

 public class RedirectStreams { public RedirectStreams(Process process1, Process process2) { final Process tmpProcess1 = process1; final Process tmpProcess2 = process2; new Thread(new Runnable() { @Override public void run() { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(tmpProcess1.getInputStream())); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(tmpProcess2.getOutputStream())); String lineToPipe; try { while ((lineToPipe = bufferedReader.readLine()) != null){ System.out.println("Output process1 / Input process2:" + lineToPipe); bufferedWriter.write(lineToPipe + '\n'); bufferedWriter.flush(); } } catch (IOException e) { e.printStackTrace(); } } }).start(); } } 

输入过程1:回声回声回声

输出过程1 /输入过程2:回声回声

输出过程2:回声