【发布时间】:2011-09-14 05:01:08
【问题描述】:
我想从我的 Java 应用程序启动外部第三方应用程序。这个外部应用程序应该在我的 java 应用程序运行时一直运行。
有时(取决于用户交互)我的 java 应用程序应该能够通过 stdin 和 stdout 读取和写入此外部应用程序。
我该怎么做?
【问题讨论】:
标签: java communication external-process
我想从我的 Java 应用程序启动外部第三方应用程序。这个外部应用程序应该在我的 java 应用程序运行时一直运行。
有时(取决于用户交互)我的 java 应用程序应该能够通过 stdin 和 stdout 读取和写入此外部应用程序。
我该怎么做?
【问题讨论】:
标签: java communication external-process
是前应用程序原生代码,还是其他 Java 程序?如果是原生代码,看http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Process.html和http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Runtime.html
这些将允许您执行本机程序,跟踪其状态,并获取其输出并将其发送输入。
【讨论】:
基本上,您将需要 Java 中的多个线程来监视外部进程的结束并围绕其输入/输出/错误流进行随机播放,以便您的主 Java 应用可以访问它。
使用 Process 之类的类可以使用更多“基本”方法,但我建议使用 Apache Commons-exec,它提供了一些有用的工具来处理返回值和 I/O。
【讨论】:
在您实施启动Process 的建议时,请阅读并实施所有When Runtime.exec() won't 的建议。
还可以考虑使用ProcessBuilder 代替Runtime.exec()(如果编码为1.5+)。
【讨论】:
class StreamGobbler extends Thread。
这取决于外部应用程序的具体情况,主要是:第 3 方还是您可以控制的东西?...它是用什么构建的,它的功能是什么,等等。 p>
“kludgy”方法是简单地使用文件系统并让 Java 监视放置在特定位置的文件(注意适当地处理锁定的文件)。更复杂的方法是通过套接字进行通信,或者写入本地/内部托管数据库(如 hsqldb)中的数据库表。通过 java.lang.Process 使用输入/输出流也可以解决问题,当然这取决于第 3 方应用程序。
但是再次所有这取决于您正在与之通信的应用程序的细节。如果第 3 方应用程序是 Excel,Java 的 Process 类将无济于事(在这种情况下,您可能必须按照我提到的第一种方法查看 xls 文件的保存目录)。
【讨论】: