Java:无法使用参数执行外部exe

时间:2018-04-06 19:15:38

标签: java processbuilder

我正在尝试使用参数运行外部程序。例如,该程序可以采用不同类型的参数 avl tip.avlavl < test.ops

我可以通过

运行avl tip.avl
try {
    String[] list = {"avl", "test_0.avl"};
    ProcessBuilder pb = new ProcessBuilder(list);
    pb.command(list);
    final Process p = pb.start();
    BufferedReader br = new BufferedReader( new InputStreamReader( p.getInputStream() ) );
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (Exception ex) {
    System.out.println(ex);
}

但是当我尝试

String[] list = {"avl", "<", "test_0.ops"};
ProcessBuilder pb = new ProcessBuilder(list);
pb.command(list);
final Process p = pb.start();

"<"不会作为参数发送,而是作为程序运行后的输入。当我从命令行尝试它时,avl < test.ops正常工作,但无法通过ProcessBuilder使用它。

我认为avl tip.avl有效,因为正在运行avl tip.avl与运行avl然后键入tip.avl相同。 ProcessBuilder似乎在做什么......

我认为参数将全部传递给一个人。执行命令提示输入avl < test.ops + ENTER

的正确方法是什么

3 个答案:

答案 0 :(得分:4)

您无法从Java重定向输入。使用<是一个特殊的shell管道重定向命令。

您必须使用processBuilder.getOutputStream()向流程写入数据,否则您可以使用redirectInput.

答案 1 :(得分:1)

  

"<"不会作为参数发送,而是作为程序运行后的输入

不,那不对。它作为参数传递,就像test_0.avltest_0.ops一样。

  

[...]与运行avl然后输入tip.avl

相同

不,那是从不在shell中发生的事情。 shell将传递tip.avl作为第一个参数。

也就是说,你的shell特别处理<符号,因为它会特殊处理>|。使用ProcessBuilder时,不会发生特殊处理。你的第二次调用与shell中的相同:

avl '<' test_0.ops

这将禁用<的特殊含义。当然,这不是你想要的。

答案 2 :(得分:1)

谢谢你们两位,下面按预期工作。

File pipe = new File("test_0.ops");
ProcessBuilder pb = new ProcessBuilder("avl");
pb.redirectInput(pipe);
final Process p = pb.start();