2012-09-11 151 views
5

我通常使用java.lang.ProcessBuilder和java.lang.Process来运行外部命令行程序,并且它对于运行和完成命令正常工作。例如,这会在工作目录下运行“myProgram”与参数“myArg”:从java运行交互式命令行应用程序

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来做到这一点,还是我需要一种不同的方法?还是有一些图书馆可以帮助我呢?

回答

4

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

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

如果你想要写的东西的过程的输入:

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

+0

与标准输入和标准输出你的意思是System.in和System.out? – 11684

+0

@ 11684是的,我更新了答案。 –

+0

谢谢!一直在寻找这一点。 – dantiston

0

重定向stdin和stdout无疑是简单命令行程序的一种选择。

使用 “机器人” 类是另一种,如果你真正需要的脚本按键(例如,在测试脚本):

编写一个调用Java程序并使用“<”和“>”重定向操作符的简单.bat文件或shell脚本还没有第三选择。

这一切都取决于你在找什么:)

+0

我基本上想通过确认提示强制执行一个没有--force标志或等效的程序。 – smcg

+0

你可以在shell脚本中运行程序吗?如果“是”,那就足够了吗? – paulsm4

+0

这将是一个kludge。 – smcg