Java:popen() - 喜欢函数?

时间:2010-05-22 10:01:18

标签: java popen

这是在本地Processing计划的背景下。我想运行一个外部程序来获取一些数据。我可以使用popen()或等效函数吗?

3 个答案:

答案 0 :(得分:10)

Process process = Runtime.getRuntime().exec("your command");

然后,您可以使用Process流来读取和写入数据。

答案 1 :(得分:3)

JDK5引入ProcessBuilder以更好地控制流程生成。

Process process = new ProcessBuilder(command).start()

请注意,调用内部forkAndExec,fork'生成整个父地址空间的副本',这样当父进程有大量内存空间时,即使是一个小命令也可能导致OutOfMemoryErrors收购。

see here

答案 2 :(得分:1)

popen()的密友是要像在UNIX中那样将命名管道作为输入和/或输出:

mknod /tmp/mypipe.12345 p ; sort -o /tmp/mypipe.12345 /tmp/mypipe.12345 &

然后打开/tmp/mypipe.12345,写,关闭,打开/tmp/mypipe.12345,读,关闭。由于排序直到输入上的EOF都不能写任何东西,因此输出打开将在输入关闭之后发生。 popen()调用无法做到这一点!

对于更简单的情况,只能读取或写入命名管道。

当然,您仍然需要将其拆分,例如在system(...)调用中。

您要在完成后删除命名管道。在某些UNIX系统上,/tmp在重新引导时被清除。

/tmp是共享的,因此很可能发生名称冲突。您可以在 Java 中生成部分随机的管道文件名(/tmp/mypipe.12345的数字部分)来防止这种情况。在某些系统中,重击会为/var/tmp<(...)的每次使用在>(...)中创建命名管道。不幸的是,确定何时可以将其删除而没有效果(定影器?)是一个挑战!