以管道

时间:2016-07-23 23:46:05

标签: java process outputstream processbuilder

我在将数据从java发送到 ProcessBuilder / Process 创建的(linux)-subprocess时遇到问题。

基于shell的基本示例如下所示,并且工作正常。

echo "hello world" | cat - >/tmp/receive.dat

现在,我想用一个java程序替换echo "hello world",该程序应在内部创建一个新进程(cat - >/tmp/receive.dat),然后向其发送数据。

我尝试了以下操作,但文件/tmp/receive.dat保持不变:

String[] cmdArray = { "/bin/cat", "-", ">/tmp/receive.dat" };
ProcessBuilder builder = new ProcessBuilder (cmdArray);
builder.directory (new File ("/tmp"));
Process p = builder.start ();
OutputStream pos = p.getOutputStream ();

byte [] bytes = "hello world".getBytes ();
pos.write (bytes);
pos.close ();
p.waitFor ();

在Windows下也是如此,当然还有改编的cmdArray:

cmd /c type con >c:\tmp\receive.dat

从java直接打印到system.out是没有选择的,因为应该在java程序的生命周期内调用许多子进程。

这是任何帮助! 通博

2 个答案:

答案 0 :(得分:1)

这里的问题是/bin/cat实际上没有写入文件,它只是写入标准输出。输出重定向>/tmp/receive.dat实际上是由shell执行的,但是您通过以这种方式调用cat来绕过shell。

如果您要实现的只是一个写入文件的OutputStream,那么通过标准的Java I / O(例如,FileOutputStream和朋友)这样做就是您想要的。它也是跨平台的(即Windows友好的),不同于依赖于shell的任何东西。

关于由于子进程而无法仅从java写入标准输出的注释 - 您调用的任何子进程都可以从其父进程继承标准输出(java进程 - 查看ProcessBuilder.Redirect.INHERIT)。因此,即使您从java调用子进程,将所有输出重定向到文件仍应以与初始示例(java程序替换echo命令)相同的方式工作。

答案 1 :(得分:-1)

你可能想要ProcessBuilder#redirectOutput(File),因为>功能不是cat,而是什么叫cat(在我们看来,是流程构建器)。