近日,在畢業設計裡面遇到了這樣一個情景:需要在web項目運行時,動態地對一個已有的項目進行打包操作。
由於,之前在一些項目中,曾經遇到過相似的情況,因此,我把問題的解決方案定位到Runtime這個類上。
說起Runtime這個類,說實在用的不是很多,之前在項目中用到這個類主要是通過Runtime擷取JVM的運行時環境,從而執行window命令來擷取機器的mac地址,下面簡單列舉一下,如果利用Runtime擷取執行window命令“ipconfig -all”,至於如果獲得mac地址,應該不用我說了吧,自己搞個Regex匹配一下就可以啦.
StringBuilder sb = new StringBuilder();
sb.append("ipconfig -all");
try {
Process process = Runtime.getRuntime().exec(sb.toString());
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
如果要執行其他命令的話,方法類似,我就不再一一舉例了。下面,我再把幾點個人總結在下面列一下,好讓你別走彎路。
1.如果要執行一些cmd命令,很多時候,如果像上面ipconfig一樣直接往exec方面裡塞的話,很可能會報錯,說不支援該命令。解決的辦法就是把cmd控制台開啟吧,命令如下:“cmd /C cd D:/folderA/floderB”,首先要說明一下,通過這種方式開啟的控制台,其預設的路徑,就是當前檔案的路徑,如果要想轉到目錄A/目錄B下搞些什麼搞錯,就可以用上面的命令。但是上面的命令簡直就是沒有意義的,它只是把cmd的預設目錄改一下,除此之外什麼也沒幹。如果要執行多條命令怎麼辦呢?我們可以利用“&&”與運算,不懂這個操作符的自己查書吧。好了,我們把命令改一下,"cmd /C cd D:/folderA/floderB && mkdir abc".好了。這樣,我們就可以在D:/folderA/floderB目錄下,建立一個叫做abc的目錄了。
2.還是用上面控制台cmd命令來說吧,假如你執行的命令,沒有傳回值的話,你可以就Runtime.getRuntime().exec(command);這樣把命令很好地執行。但是假如你執行的命令,在執行的過程中要在控制台列印些東西,那麼你就要多寫些代碼了,否則,你的程式不會自動執行,看上次貌似卡死了。其實並不是這樣,當命令執行的時候,jdk把命令的輸出送到緩衝區裡面去了,並且,我發現,如果你不把緩衝區清空的話,程式是不會結束的,也就是說,你所執行的命令是未執行結束的,儘管你在你自己的調試輸出中看起來時結束了。這個時候,必須要把Process process = Runtime.getRuntime().exec(command);用上,process是一個子進程,它有兩個可以擷取緩衝區內容的方法,一個是process.getErrorStream()用來擷取命令執行出錯的資訊,另一個是process.getInputStream()用來擷取命令執行的正常輸出。好了,如果你遇到了程式不能正常自動結束的話,通過這兩個方法,返回一個InputStream對象,再把這個對象read()乾淨,這樣,你的程式就可以自動正常結束了。
3.有時候,在控制台輸出的是中文,要注意選好讀操作類,不然輸出的是中文是亂碼。