1. 程式人生 > 程式設計 >Windows下Java呼叫可執行檔案程式碼例項

Windows下Java呼叫可執行檔案程式碼例項

這篇文章主要介紹了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();
    }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。