这是在本地Processing计划的背景下。我想运行一个外部程序来获取一些数据。我可以使用popen()或等效函数吗?
答案 0 :(得分:10)
Process process = Runtime.getRuntime().exec("your command");
然后,您可以使用Process
流来读取和写入数据。
答案 1 :(得分:3)
JDK5引入ProcessBuilder以更好地控制流程生成。
Process process = new ProcessBuilder(command).start()
请注意,调用内部forkAndExec,fork'生成整个父地址空间的副本',这样当父进程有大量内存空间时,即使是一个小命令也可能导致OutOfMemoryErrors收购。
答案 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
或<(...)
的每次使用在>(...)
中创建命名管道。不幸的是,确定何时可以将其删除而没有效果(定影器?)是一个挑战!