Java: 无法执行带参数的外部 exe

Java: Can't execute external exe with arguments

我正在尝试 运行 带参数的外部程序。该程序可以采用不同类型的参数,例如 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 有效,因为 运行ning avl tip.avl 与仅 运行ning avl 然后键入 tip.avl 相同。 ProcessBuilder 似乎实际上在做什么...

我假设所有的论点都会被一次传递。执行命令提示符输入的正确方法是什么 avl < test.ops + ENTER

您不能像 Java 那样重定向输入。使用 < 是一个特殊的 shell 管道重定向命令。

您要么必须使用 processBuilder.getOutputStream() 将数据写入进程,要么您可以使用 redirectInput.

the "<" does not get sent as an argument, but as an input after the program runs

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

[…] the same as just running avl and then typing tip.avl

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

就是说,special-handles 是 < 的标志,就像 special-handle >| 一样。当您使用 ProcessBuilder 时,不会发生这种特殊处理。您的第二次调用等同于 shell:

avl '<' test_0.ops

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

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

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