用Java运行交互式命令行应用程序

11

我通常使用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中实现此功能,还是需要使用不同的方法?或者是否有一些库可以帮助我实现这一点?

2个回答

5
根据文档,您应该能够重定向输入和输出流。这会告诉它使用父进程的System.in/System.out
builder.redirectInput(ProcessBuilder.Redirect.INHERIT);
builder.redirectOutput(ProcessBuilder.Redirect.INHERIT);

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

你说的stdin和stdout是指System.in和System.out吗? - 11684
谢谢!我已经找了很久这个了。 - dantiston
我使用这个(包括重定向错误流)从Java命令行程序启动了/usr/bin/vi,它的表现正如我所希望的那样。 - Christopher Schultz
这是绝对错误的答案,因为它不会打开交互式伪终端,这是无用的,因为子进程将缓冲从而阻止任何交互。 - Enerccio

0

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

使用“机器人”类是另一种选项,如果您实际上需要脚本化按键(例如,在测试脚本中):

编写一个简单的 .bat 文件或 shell 脚本,调用你的 Java 程序并使用 "<" 和 ">" 重定向操作符是第三个选项。
一切都取决于你要寻找什么 :)

我基本上想要强制执行确认提示,对于一个没有 --force 标志或相当的程序。 - smcg
你能在shell脚本中运行程序吗?如果“是”,那是否足够? - paulsm4
@smcg - 正如我所说,“一切都取决于你要寻找什么 :)”。 我只是想确保您拥有所有可用的答案。 祝你好运! 真诚地.. PSM - paulsm4
你说的stdin和stdout是指System.in和System.out吗? - 11684

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接