2013-04-24 173 views
0

我有一個Java應用程序,使用wget從Web服務下載文件。當通過java執行命令時,它返回:「wget:不是http或ftp url:」 當我直接執行命令時,它運行時沒有問題。這裏是我的代碼:Runtime.exec命令不工作

try { 
     Debug.println("Starting copy of "+srcFile+" to "+destFile); 
     String command = "wget -O " + destFile + " \""+ srcFile +"\""; 
     Process p = Runtime.getRuntime().exec(command); 
     int exitCode = p.waitFor(); 

     if(Debug.isDebugMode()) 
     { 
      Debug.println(command); 
      BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getErrorStream())); 

      String s; 
      while((s = stdInput.readLine()) != null) 
      { 
       Debug.println(s); 
      } 
     } 
     Debug.println("Finished with code: " + String.valueOf(exitCode)); 
    } 
    catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return false; 

這是輸出:

24/04/2013 10:11:05 Starting copy of stoppenmetroken.webcolors.local/service/track?track=3b1ac68a288345c183a08c714901a398&mac=089000A09090 to /opt/byato/data/song/3b1ac68a288345c183a08c714901a398 
24/04/2013 10:11:05 wget -O /opt/byato/data/song/3b1ac68a288345c183a08c714901a398 "stoppenmetroken.webcolors.local/service/track?track=3b1ac68a288345c183a08c714901a398&mac=089000A09090" 
24/04/2013 10:11:05 wget: not an http or ftp url: "http://stoppenmetroken.webcolors.local/service/track?track=3b1ac68a288345c183a08c714901a398&mac=089000A09090" 
24/04/2013 10:11:05 Finished with code: 1 

PS:我刪除了HTTP:輸出//一部分,因爲我沒有足夠的信譽分-.-

我錯過了什麼?

+1

通過'Runtime#exec'上的'ProcessBuilder'開始。它允許你傳遞參數作爲單獨的參數,而不必嘗試和建立一個字符串,照顧引號 – MadProgrammer 2013-04-24 08:28:32

+2

'Runtime#exec(String [])'避免了需要建立一個單一的字符串的命令。 – user1252434 2013-04-24 08:29:47

回答

0

我懷疑這一點:

String command = "wget -O " + destFile + " \""+ srcFile +"\""; 

的問題。在shell中運行時,URL中的引號將被刪除。但是,當您通過Java運行時,您不是通過shell運行的,並且您的URL以"http...開頭(仔細查看錯誤消息)。

如果你不想要Runtime.exec() t o解析和分割你的論點,那麼你可以考慮the variant that takes individual arguments。更有效的解決方案仍然是使用HttpComponents進行下載。

+0

解決它使用: String [] command = {「wget」,「-O」,destFile,srcFile}; 現在運行。日Thnx – 2013-04-24 08:35:18

2

你能試圖執行這樣的命令:

方法P =調用Runtime.getRuntime()EXEC( 「/斌/慶典-c」 +命令); //爲Linux

方法P =調用Runtime.getRuntime()EXEC( 「cmd.exe的/ C」 +命令); // for Windows

有時我們需要顯式調用Linux shell或命令提示符。

希望這會起作用。