我在将数据从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程序的生命周期内调用许多子进程。
这是任何帮助! 通博答案 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(在我们看来,是流程构建器)。