当前位置: 首页 > 知识库问答 >
问题:

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

从阎宝
2023-03-14

我无法将数据从java发送到ProcessBuilder/Process创建的(linux)子进程。

仅基于shell的基本示例如下所示,效果良好。

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

现在,我想用一个java程序来代替echo“hello world”,该程序应该在内部创建一个新的进程(即cat)-

我尝试了以下操作,但是文件/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之外没有其他选择,因为许多子流程应该在java程序的livecycle中调用

谢谢你的帮助!汤博


共有2个答案

东门俊智
2023-03-14

您可能希望ProcessBuilder#重定向输出(文件)作为

百里杰
2023-03-14

这里的问题是,/bin/cat实际上并没有写入文件,它只是写入标准输出。输出重定向

如果您试图实现的只是一个写入文件的输出流,那么通过标准java I/O(例如FileOutputStream和friends)实现这一点就是您想要的。它也是跨平台的(即Windows友好型),不同于依赖于外壳的任何东西。

关于因为子进程而不能从java直接写入standard out的评论,您调用的任何子进程都可以从其父进程(java进程)继承standard out,请查看ProcessBuilder.Redirect.inherit)。因此,即使您从java调用子流程,将所有输出重定向到一个文件的方式仍应与初始示例(java程序替换echo命令)相同。

 类似资料:
  • 我有一个shell命令,它接受管道作为输入,例如 我试过这个: 但是我没有得到想要的结果。是使用声明的列表。谢谢

  • 因此,服务器和客户端都发生这种情况。我有来自通道活动方法的通道处理程序上下文,我正在尝试使用写入AndFlush(对象消息)方法向其写入对象,但似乎消息永远不会进入创建的管道。 下面是我的客户端处理程序的样子(我重写了包解码器和编码器中的一些方法来调试) 这是我如何写入ChannelHandlerContext通道变量 当我运行我的代码时,“从客户端写入服务器的数据”是打印机,但“在客户端上编码的

  • 问题内容: 我想在Linux操作系统上的C程序内执行以下操作: 使用syscall(或2)创建PIPE 使用exec()执行新流程 将流程的STDIN连接到先前创建的管道。 将流程的输出连接到另一个PIPE。 这样做的目的是为了性能目的而避免访问任何驱动器。 我知道使用PIPE系统调用创建管道非常简单,我可以使用popen为输入或输出目的创建管道。 但是您将如何针对输入和输出执行此操作? 问题答案

  • 我试图使用Java的类来执行包含管道的命令。例如: 然而,我得到了一个错误: 然后: 尽管该命令在命令行中运行得很好,但我无法让执行将其输出重定向到另一个的命令。 有没有办法做到这一点?

  • 问题内容: 请移至第二次更新。 我不想更改此问题的先前上下文。 我正在使用Java应用程序中的wkhtmltoimage。 使用它的标准方法是- 。 根据他们的文档,如果我们编写一个URL而不是输入URL,则输入将转换为STDIN。 我正在使用- 现在,我无法弄清楚如何将输入流传输到此过程。 我有一个读入的模板文件,并在末尾附加了一个字符串: 如何通过管道传递到流程的? 更新- 遵循Andrzej

  • 问题内容: 在执行此代码时, 我经常收到此异常,但我不知道为什么会发生。 我有一个在JBoss 4.2.3和MySQL下的Linux服务器中运行的Web应用程序。 这是怎么引起的,我该如何解决? 问题答案: 通常,这是由于客户端断开连接。客户端可能已断开连接的原因有很多(超时,浏览器关闭等)。另外,按照惯例,如果您没有打开流,那么请不要关闭。有关在此处关闭流的更多信息,我应该关闭servlet输出