我无法将数据从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中调用。
谢谢你的帮助!汤博
您可能希望ProcessBuilder#重定向输出(文件)作为
这里的问题是,/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输出