【问题标题】:Alternative to Runtime.exec() for a full Console java application?完整控制台 java 应用程序的 Runtime.exec() 替代方案?
【发布时间】:2015-02-01 03:59:12
【问题描述】:

我一直在尝试编写一个应用程序,该应用程序允许我以选项卡式方式打开多个控制台会话(在 cmd.exe 的窗口中)。

我发现的最重要的参考资料之一是在以下 URL 中,我可以在其中获取 TextAreaOutputStream 代码,以便能够从进程中读取 STDOUT,但是这和互联网上的大多数参考资料都没有解决/修复我正在处理的问题。

参考:Create Java console inside a GUI panel

即使重定向 STDOUT、STDERR 和 STDIN 给我带来了一些麻烦,最糟糕的是,当您在 Java 控制台中的一个选项卡中键入的命令执行创建子进程的命令时,它就在我的 Java 应用程序中失去控制,因为在后台创建了一个新进程。基本上,新的子进程超出了界限,我无法接收或发送任何字节给它,我的应用程序挂起。

  • JVM
    • MyTabbedConsoleApp
      • cmd.exe /k (我仍然可以与这个通信,直到这里没有问题)
        • apptrack.exe(一个子进程超出了我的应用程序的范围,没有与之通信,应用程序挂起)

我正在寻找一种更好的方法来创建一个几乎模仿控制台环境的应用程序。

【问题讨论】:

标签: java process console child-process tabbed


【解决方案1】:

您应该使用ProcessBuilder 而不是Runtime,因为它是处理操作系统进程的推荐API。

查看Changes to Runtime.exec 主题以获取 Java 6u45 发行说明。

自 JDK 以来创建操作系统进程的首选方式 5.0 正在使用 java.lang.ProcessBuilder。 ProcessBuilder 类具有更完整的 API 用于设置环境、工作目录 并为流程重定向流。

【讨论】:

  • 你知道ProcessBuilder是否支持管道重定向,以防主进程执行或在内部创建不同的控制台或子进程(嵌套进程)。我对 Runtime.exec 的主要问题是,如果 mi 进程创建了另一个子进程,主进程会无限期地等待子进程,而我没有来自子进程的 stdout 信息。
  • @mat060 我不知道,你应该为此打开一个单独的问题。
猜你喜欢
  • 2016-05-04
  • 2011-01-01
  • 2016-06-24
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多