gpt4 book ai didi

java - 作为管道写入 Java Process/ProcessBuilder 的 OutputStream

转载 作者:行者123 更新时间:2023-12-01 09:39:50 26 4
gpt4 key购买 nike

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

仅基于 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 程序的生命周期内调用许多子进程。

感谢您的帮助!通博

最佳答案

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

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

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

关于java - 作为管道写入 Java Process/ProcessBuilder 的 OutputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38547393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com