我正在尝试使用参数运行外部程序。例如,该程序可以采用不同类型的参数
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
有效,因为正在运行avl tip.avl
与运行avl
然后键入tip.avl
相同。 ProcessBuilder
似乎在做什么......
我认为参数将全部传递给一个人。执行命令提示输入avl < test.ops
+ ENTER
答案 0 :(得分:4)
您无法从Java重定向输入。使用<
是一个特殊的shell管道重定向命令。
您必须使用processBuilder.getOutputStream()
向流程写入数据,否则您可以使用redirectInput.
答案 1 :(得分:1)
"<"
不会作为参数发送,而是作为程序运行后的输入
不,那不对。它作为参数传递,就像test_0.avl
和test_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();