由于工作中要使用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";
java.lang.Runtime.getRuntime().exec(cmd+" \""+filePath+"\" /wma");
總結:此調用方式執行沒有問題,后來測試完成后部署到服務器上,發現問題又出來了,程序執行錯誤。分析原因,因為本地測試和服務器安裝路徑不同,服務器安裝軟件的目錄為C:\Program Files\4U Computing\WMA MP3 Converter\,這里路徑里有空格,造成空格處斷開,所以命令行無法正確截取參數。
三 安全的全路徑方式調用執行文件
String cmd="\"C:\\Program Files\\4U Computing\\WMA MP3 Converter\\WMAMP3Converter.exe\"";
java.lang.Runtime.getRuntime().exec(cmd+" \""+filePath+"\" /wma");
總結:在cmd串中,把可執行文件的全路徑用雙引號包含,就可以解決路徑、文件名中包含空格、全角字符等問題。
程序運行一段時間以后,發現有時候程序執行完后轉換文件沒有,程序沒有錯誤,而且服務器上有很多進程沒有結束。原來調用可執行文件失敗了,但是程序不知道,以為成功了,然后繼續去找轉換后的文件來播放導致失敗。分析原因,是因為上面的方式異步的,也就是說java提交運行文件的命令以后,立即轉到播放模塊。
解決辦法就是讓命令行同步方式執行,也就是主程序等待調用可執行文件結束以后再執行。(注:當然,播放之前檢查文件是否存在也是可以的,這里是說明同步異步的問題。)
四 異步方式調用外部可執行文件
Process process=null;
String cmd="\"C:\\Program Files\\4U Computing\\WMA MP3 Converter\\WMAMP3Converter.exe\"";
process = java.lang.Runtime.getRuntime().exec(cmd+" \""+filePath+"\" /wma");
process.waitFor();
總結:構造一個Process對象,將運行進程獲取過來,控制這個進程等待調用結束再繼續運行。OK。
五 順便說一下,使用Process對象以后,可以用如下方法返回錯誤信息和輸出信息,來進一步控制進程運行。
process.exitValue()
process.getErrorStream()
process.getInputStream()
process.getOutputStream()
posted on 2006-04-04 17:06
Q系列類、方法、變量…… 閱讀(734)
評論(0) 編輯 收藏 所屬分類:
網上工具代碼