【问题标题】:run interactive command line application from java从 java 运行交互式命令行应用程序
【发布时间】:2012-09-11 19:53:27
【问题描述】:

我通常使用 java.lang.ProcessBuilder 和 java.lang.Process 来运行外部命令行程序,它适用于运行并完成的命令。例如,这将在工作目录中运行带有参数“myArg”的“myProgram”:

List<String> commandLine = new ArrayList<String>();
commandLine.add("myProgram");
commandLine.add("myArg");
ProcessBuilder builder = new ProcessBuilder(commandLine);
builder.redirectErrorStream(true);
Process process = builder.start();

但是,假设我想运行一个脚本或程序或具有交互式输入的东西(它提示我在启动后需要更多输入)。我可以在 Java 中使用与上述类似的代码来做到这一点,还是需要不同的方法?或者是否有一些图书馆可以帮助我解决这个问题?

【问题讨论】:

    标签: java process


    【解决方案1】:

    根据the documentation,您应该能够重定向输入和输出流。这告诉它使用父进程中的System.in/System.out

    builder.redirectInput(ProcessBuilder.Redirect.INHERIT);
    builder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
    

    如果您想将内容写入进程的输入:

    如果源是 Redirect.PIPE(初始值),则可以使用 Process.getOutputStream() 返回的输出流写入子流程的标准输入。如果源设置为任何其他值,则 Process.getOutputStream() 将返回空输出流。

    【讨论】:

    • 带标准输入和标准输出的意思是 System.in 和 System.out?
    • 谢谢!找这个好久了。
    • 我使用它(包括重定向错误流)从 Java 命令行程序启动 /usr/bin/vi,它的行为完全符合我的预期。
    【解决方案2】:

    重定向标准输入和标准输出无疑是简单命令行程序的一种选择。

    如果您确实需要编写击键脚本(例如,在测试脚本中),则使用“机器人”类是另一回事:

    编写一个简单的 .bat 文件或 shell 脚本,调用您的 Java 程序并使用“”重定向运算符是第三种选择。

    这完全取决于你在寻找什么:)

    【讨论】:

    • 我基本上想通过确认提示来强制没有 --force 标志或等效项的程序。
    • 你能在 shell 脚本中运行程序吗?如果“是”,这就足够了吗?
    • @smcg - 正如我所说,“这完全取决于您要查找的内容:)”。我只是想确保你有所有可用的答案。祝你好运!真诚的.. PSM
    • 带标准输入和标准输出的意思是 System.in 和 System.out?
    猜你喜欢
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    相关资源
    最近更新 更多