8

这是在本地处理程序的上下文中。我想运行一个外部程序来获取一些数据。我可以使用 popen() 或等效函数吗?

4

3 回答 3

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

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

于 2010-05-22T10:02:30.360 回答
3

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

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

请注意,在内部调用了 forkAndExec,并且 fork '复制了整个父地址空间',因此当父进程获得大量内存空间时,即使是一个小命令也可能导致 OutOfMemoryErrors。

看这里

于 2014-01-09T14:02:12.343 回答
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)以防止这种情况发生。在某些系统中,Bash会为每个或使用创建命名管道。不幸的是,确定何时可以将它们移除而没有效果(热熔器?)有点挑战!/var/tmp<(...)>(...)

于 2019-08-21T19:53:42.967 回答