【问题标题】:Java external programJava 外部程序
【发布时间】:2011-09-14 05:01:08
【问题描述】:

我想从我的 Java 应用程序启动外部第三方应用程序。这个外部应用程序应该在我的 java 应用程序运行时一直运行。

有时(取决于用户交互)我的 java 应用程序应该能够通过 stdinstdout 读取和写入此外部应用程序。

我该怎么做?

【问题讨论】:

    标签: java communication external-process


    【解决方案1】:

    是前应用程序原生代码,还是其他 Java 程序?如果是原生代码,看http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Process.htmlhttp://download.oracle.com/javase/1.5.0/docs/api/java/lang/Runtime.html

    这些将允许您执行本机程序,跟踪其状态,并获取其输出并将其发送输入。

    【讨论】:

      【解决方案2】:

      基本上,您将需要 Java 中的多个线程来监视外部进程的结束并围绕其输入/输出/错误流进行随机播放,以便您的主 Java 应用可以访问它。

      使用 Process 之类的类可以使用更多“基本”方法,但我建议使用 Apache Commons-exec,它提供了一些有用的工具来处理返回值和 I/O。

      【讨论】:

        【解决方案3】:

        在您实施启动Process 的建议时,请阅读并实施所有When Runtime.exec() won't 的建议。

        还可以考虑使用ProcessBuilder 代替Runtime.exec()(如果编码为1.5+)。

        【讨论】:

        • 好吧,我和 Process 和 ProcessBuilder 很相似。但是,当它由 ex-app(native app) 发送时,我怎样才能立即获得输出?我等不及前应用程序结束。
        • @MiniKarol:这篇文章解决了这个问题;见class StreamGobbler extends Thread
        【解决方案4】:

        这取决于外部应用程序的具体情况,主要是:第 3 方还是您可以控制的东西?...它是用什么构建的,它的功能是什么,等等。 p>

        “kludgy”方法是简单地使用文件系统并让 Java 监视放置在特定位置的文件(注意适当地处理锁定的文件)。更复杂的方法是通过套接字进行通信,或者写入本地/内部托管数据库(如 hsqldb)中的数据库表。通过 java.lang.Process 使用输入/输出流也可以解决问题,当然这取决于第 3 方应用程序。

        但是再次所有这取决于您正在与之通信的应用程序的细节。如果第 3 方应用程序是 Excel,Java 的 Process 类将无济于事(在这种情况下,您可能必须按照我提到的第一种方法查看 xls 文件的保存目录)。

        【讨论】:

        • 这是一个第 3 方应用程序,我可以通过标准输入和标准输出与之通信。协议描述得很好。只有一个问题——我的 Java 技能;)。
        • 好吧,在这种情况下,好消息是,无论如何,您不需要上面描述的杂乱无章或复杂的解决方案。
        猜你喜欢
        • 1970-01-01
        • 2014-10-09
        • 1970-01-01
        • 2011-09-08
        • 2016-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多