[英]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
有效,是因為運行avl tip.avl
與運行avl
然后輸入tip.avl
。 這似乎是ProcessBuilder
實際上正在做的...
我認為這些論點將一並通過。 什么是執行命令提示符輸入所做的正確方法avl < test.ops
+ ENTER
您不能從Java重定向輸入。 使用<
是特殊的外殼管道重定向命令。
您將必須使用processBuilder.getOutputStream()
將數據寫入進程,否則可以使用redirectInput。
"<"
不會作為參數發送,而是在程序運行后作為輸入發送
不,那是不對的。 就像test_0.avl
和test_0.ops
一樣,它作為參數傳遞。
[…]與只運行
avl
,然后鍵入tip.avl
不,殼中永遠不會發生這種情況。 外殼將傳遞tip.avl
作為第一個參數。
也就是說,是您的shell特殊處理<
符號,就像特殊處理>
和|
。 當您使用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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.