Java: 无法执行带参数的外部 exe
Java: Can't execute external exe with arguments
我正在尝试 运行 带参数的外部程序。该程序可以采用不同类型的参数,例如
avl tip.avl
或 avl < 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.avl
和 test_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();
我正在尝试 运行 带参数的外部程序。该程序可以采用不同类型的参数,例如
avl tip.avl
或 avl < 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.avl
和 test_0.ops
一样。
[…] the same as just running
avl
and then typingtip.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();