在Java 7中使用ProcessBuilder构建进程管道

8
我一直在尝试使用新的ProcessBuilder在Java中传递几个进程。我找不到一个适合我的例子,当我自己尝试时,进程就会挂起。我需要一个非常简单的例子代码来运行相当于cat test.txt | wc 的命令,但不是通过shell。
--更新--
好的,为了澄清。我知道有方法可以通过读写流来模拟管道。我想知道在Java 7中介绍的 redirectInput redirectOutput 方法是否以某种自动方式完成。
2个回答

4
在这种情况下,您不需要使用管道。
"grep bla test.txt"

然而,假设您需要一个管道,您需要使用像bash这样的shell。
"/bin/bash", "-c", "grep foo text.txt | grep bar"

3
我正尝试使用ProcessBuilder中的redirectInput和redirectOutput方法来模拟管道。 - Aleksandar Savkov
1
我不确定是否可能。你有没有想法PIPE([链接]http://www.fxfrog.com/docs_www/api/java/lang/ProcessBuilder.Redirect.html#PIPE)类型是用来做什么的?我想象中可以将输出重定向为另一个进程的输入。 - Aleksandar Savkov
1
Javadoc中指出:Indicates that subprocess I/O will be connected to the current Java process over a pipe. 意思是说,你必须在当前的Java进程中读写流。也就是说,管道是在你运行的进程和Java进程之间,而不是在你运行的两个进程之间。 - Peter Lawrey
1
我之前一直在使用shell,但我希望使用更Java风格的方式来构建管道。现在我正在按照Aaron Digulla的建议进行操作。我复制了这个(http://blog.bensmann.com/piping-between-processes)实现方式,非常好用。 - Aleksandar Savkov
2
很令人失望的是,Java API和Apache Commons都没有提供将进程链接成管道的方法。我猜不够多的人欣赏管道的优雅。 - Sridhar Sarnobat
显示剩余4条评论

3

run()中为每个Input-/OutputStream对启动一个子线程,并使用简单的复制循环。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接