繁体   English   中英

Java:popen() - 喜欢函数?

[英]Java: popen()-like function?

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

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

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

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

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

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

看这里

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创建命名管道。 不幸的是,确定何时可以在没有效果的情况下移除它们(fuser?)是一个挑战!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM