由于工作中要使用Java調用4U Wma Mp3 Converter指令行将vox格式轉換成WMA格式,以友善在網頁中試聽,是以想到用java.lang.Runtime來處理這個問題。在使用過程中碰到了一些以前沒有留意的問題,整理如下:
一 最簡單的調用方式
String cmd="WMAMP3Converter.exe";
java.lang.Runtime.getRuntime().exec(cmd+" /""+filePath+"/" /wma");
總結:此方法,要求可執行檔案在Tomcat的工作目錄中。一般的,程式安裝目錄都在Tomcat目錄之外,是以使用絕對路徑來替代以上方案。
二 使用全路徑調用可執行檔案
String cmd="C://WMA//WMAMP3Converter.exe";
總結:此調用方式執行沒有問題,後來測試完成後部署到伺服器上,發現問題又出來了,程式執行錯誤。分析原因,因為本地測試和伺服器安裝路徑不同,伺服器安裝軟體的目錄為C:/Program Files/4U Computing/WMA MP3 Converter/,這裡路徑裡有空格,造成空格處斷開,是以指令行無法正确截取參數。
三 安全的全路徑方式調用執行檔案
String cmd="/"C://Program Files//4U Computing//WMA MP3 Converter//WMAMP3Converter.exe/"";
總結:在cmd串中,把可執行檔案的全路徑用雙引号包含,就可以解決路徑、檔案名中包含空格、全角字元等問題。
程式運作一段時間以後,發現有時候程式執行完後轉換檔案沒有,程式沒有錯誤,而且伺服器上有很多程序沒有結束。原來調用可執行檔案失敗了,但是程式不知道,以為成功了,然後繼續去找轉換後的檔案來播放導緻失敗。分析原因,是因為上面的方式異步的,也就是說java送出運作檔案的指令以後,立即轉到播放子產品。
解決辦法就是讓指令行同步方式執行,也就是主程式等待調用可執行檔案結束以後再執行。(注:當然,播放之前檢查檔案是否存在也是可以的,這裡是說明同步異步的問題。)
四 異步方式調用外部可執行檔案
Process process=null;
process = java.lang.Runtime.getRuntime().exec(cmd+" /""+filePath+"/" /wma");
process.waitFor();
總結:構造一個Process對象,将運作程序擷取過來,控制這個程序等待調用結束再繼續運作。OK。
五 順便說一下,使用Process對象以後,可以用如下方法傳回錯誤資訊和輸出資訊,來進一步控制程序運作。
process.exitValue()
process.getErrorStream()
process.getInputStream()
process.getOutputStream()