Windows下Java呼叫可執行檔案程式碼例項
阿新 • • 發佈:2020-01-07
這篇文章主要介紹了Windows下Java呼叫可執行檔案程式碼例項,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
緣起:
由於沒有找到java轉換檔案的介面,因此使用java呼叫exe檔案進行檔案轉換
public void convertFile(){ Runtime rn = Runtime.getRuntime(); Process p =null; try{ p = rn.exec("D:/convert/Convert.exe D:/convert/my.ifc D:/convert/tmp.dae"); }catch (Exception e){ e.printStackTrace(); } }
呼叫這個方法,就可以實現檔案的轉換了,和在命令視窗執行的結果一樣
獲取執行結果
public void convertFile(){ Runtime rn = Runtime.getRuntime(); Process p =null; try{ p = rn.exec("D:/convert/Convert.exe D:/convert/my.ifc D:/convert/tmp.dae");int exitVal = p.waitFor(); if (exitVal == 0) { System.out.println("轉換成功."); } else { System.out.println( "轉換失敗."); } }catch (Exception e){ e.printStackTrace(); }finally { p.destroy(); } }
注:
安全編碼規範中都會指出:使用Process.waitfor的時候,可能導致程序阻塞,甚至死鎖
出現掛起的原因為:可執行程式的標準輸出比較多,而執行視窗的標準輸出緩衝區不夠大。
1.主程序中呼叫Runtime.exec會建立一個子程序,用於執行程式。子程序建立後會和主程序分別獨立執行
2.主程序需要等待指令碼執行完成,然後對執行程式返回值或輸出進行處理,所以這裡主程序呼叫Process.waitfor等待子程序完成
3.子程序執行過程就是不斷的列印資訊。主程序中可以通過Process.getInputStream和Process.getErrorStream獲取並處理
4.子程序不斷向主程序發生資料,而主程序呼叫Process.waitfor後已掛起。當前子程序和主程序之間的緩衝區塞滿後,子程序不能繼續寫資料,然後也會掛起
5.子程序等待主程序讀取資料,主程序等待子程序結束,兩個程序相互等待,最終導致死鎖
解決的辦法是,利用Java中Process類提供的方法讓Java虛擬機器截獲被呼叫程式的DOS執行視窗的標準輸出,在waitfor()命令之前讀出視窗的標準輸出緩衝區中的內容。
優化程式碼
public void convertFile(){ Runtime rn = Runtime.getRuntime(); Process p =null; try{ p = rn.exec("D:/convert/Convert.exe D:/convert/my.ifc D:/convert/tmp.dae"); InputStream stdin = p.getInputStream(); InputStreamReader isr = new InputStreamReader(stdin); BufferedReader br = new BufferedReader(isr); String line = null; System.out.println("<output>"); while ((line = br.readLine()) != null) System.out.println(line); System.out.println("</output>"); int exitVal = p.waitFor(); if (exitVal == 0) { System.out.println("轉換成功."); } else { System.out.println( "轉換失敗."); } }catch (Exception e){ e.printStackTrace(); }finally { p.destroy(); } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。