【问题标题】:Capture IO of spawned program in Java在 Java 中捕获生成程序的 IO
【发布时间】:2013-03-26 19:08:16
【问题描述】:

我正在用 Java 编写一个程序,它依赖于与我位于同一目录中的预编译第三方 JAR。在运行时,我的程序会检查此文件是否存在,如果不存在则下载它。然后执行它的主类。但是,生成的程序会直接将大量文本打印到控制台。有没有办法从stdout“捕获”(并因此隐藏)这个输出并将我自己的输入直接从我的父应用程序返回到stdin?理想情况下,我希望子程序驻留在同一个 JVM 中,所以我想避免使用任何版本的 Runtime.exec()

【问题讨论】:

  • 启动 JAR 时,您可以将输出通过管道传输到文件或其他可读介质吗?
  • 预编译的 JAR 直接调用 System.out.print() 的变体。由于我无法修改这些调用,还有什么方法可以管道输出吗?
  • 只要使用System.setOut
  • 在执行第三方代码时,您是否执行其他任何操作(例如,在不同的线程中)?我想知道你是否可以使用System.setOut - 编辑:被击败 1 秒:P
  • @robbie_c 目前,我正在将第三方 JAR 作为新线程生成,但这是除父线程之外的唯一线程。我仍然希望我的父线程能够打印到控制台并从控制台接收输入。如果我使用了System.setOut,这可能吗?

标签: java multithreading jar io spawn


【解决方案1】:

使用 Java 1.5+ ProcessBuilder 类和 Process 类。请记住,如果您未正确处理其流,该进程将阻塞。

【讨论】:

  • 这不会在新的 JVM 中生成它吗?这如何帮助我捕获 IO 流?
  • 你是对的。 Process 的优点是它具有 getOutputStream 和 getInputStream 方法。你真的需要使用 3rd-part JAr 的 main 方法吗?你可以在不调用它的 main 的情况下调用它的服务吗?不过,您仍然会遇到标准 IO 流问题。
  • 不,我不需要直接调用主类,但如果可能的话,我想把整个东西放在一个 JVM 中。
  • 我认为最好的办法就是将 main 方法作为常规方法调用,而不是作为外部应用程序调用。但首先按照其他评论者的建议,使用管道流调用 System.setOut。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
  • 2013-01-10
  • 2014-03-22
  • 2014-07-01
  • 1970-01-01
  • 2013-06-22
相关资源
最近更新 更多