java Runtime基礎

來源:互聯網
上載者:User

 

Java中使用Runtime和Process類運行外部程式

使用Runtime.getRuntime().exec()方法可以在java程式裡運行外部程式。
  1. exec(String command)
  2. exec(String command, String envp[], File dir)
  3. exec(String cmd, String envp[])
  4. exec(String cmdarray[])
  5. exec(String cmdarray[], String envp[])
  6. exec(String cmdarray[], String envp[], File dir)
一般的應用程式可以直接使用第一版本,當有環境變數傳遞的時候使用後面的版本。其中2和6版本可以傳遞一個目錄,標識目前的目錄,因為有些程式是使用相對目錄的,所以就要使用這個版本。

cmd.exe /c start <FileName>
使用DOS命令(比如dir)時也要使用到調用。如果想與調用的程式進行互動,那麼就要使用該方法的返回對象Process了,通過Process的getInputStream(),getOutputStream()和getErrorStream()方法可以得到輸入輸出資料流,然後通過InputStream可以得到程式對控制台的輸出資訊,通過OutputStream可以給程式輸入指令,這樣就達到了程式的交換功能。

用Java編寫應用時,有時需要在程式中調用另一個現成的可執行程式或系統命令,這時可以通過組合使用Java提供的Runtime類和Process類的方法實現。下面是一種比較典型的程式模式:

1  
2  Process process = Runtime.getRuntime().exec(".\\p.exe");
3  process.waitfor();
4  

在上面的程式中,第一行的“.\\p.exe”是要執行的程式名,Runtime.getRuntime()返回當前應用程式的Runtime對象,該對象的exec()方法指示Java虛擬機器建立一個子進程執行指定的可執行程式,並返回與該子進程對應的Process對象執行個體。通過Process可以控制該子進程的執行或擷取該子進程的資訊。第二條語句的目的等待子進程完成再往下執行。
但在windows平台上,如果處理不當,有時並不能得到預期的結果。下面是筆者在實際編程中總結的幾種需要注意的情況:
  1、執行DOS的內部命令
  如果要執行一條DOS內部命令,有兩種方法。一種方法是把命令直譯器包含在exec()的參數中。例如,執行dir命令,在NT上,可寫成exec("cmd.exe   /c dir"),在windows95/98下,可寫成“command.exe /c dir”,其中參數“/c”表示命令執行後關閉DOS立即關閉視窗。另一種方法是,把內部命令放在一個批命令my_dir.bat檔案中,在Java程式中寫成exec("my_dir.bat")。如果僅僅寫成exec("dir"),Java虛擬機器則會報執行階段錯誤。前一種方法要保證程式的可移植性,需要在程式中讀取啟動並執行作業系統平台,以調用不同的命令直譯器。後一種方法則不需要做更多的處理。
  2、開啟一個不可執行檔檔案
  開啟一個不可執行檔檔案,但該檔案存在相關 App程式,則可以有兩種方式。以開啟一個word文檔a.doc檔案為例,Java中可以有以下兩種寫法:

1  exec("start .\\a.doc");
2  exec("Files\\Microsoft Office\\office\\winword.exe .\\a.doc");

  顯然,前一種方法更為簡捷方便。
  3、執行一個有標準輸出的DOS可執行程式
  在Windows平台上,運行被調用程式的DOS視窗在程式執行完畢後往往並不會自動關閉,從而導致Java應用程式阻塞在waitfor()語句。導致該現象的一個可能的原因是,該可執行程式的標準輸出比較多,而運行視窗的標準輸出緩衝區不夠大。解決的辦法是,利用Java中Process類提供的方法讓Java虛擬機器截獲被調用程式的DOS運行視窗的標準輸出,在waitfor()命令之前讀出視窗的標準輸出緩衝區中的內容。一段典型的程式如下:

1  
2  String s;
3  Process process = Runtime.getRuntime().exec("cmd /c dir \\windows");
4  BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream());
5  while((s=bufferedReader.readLine()) != null)
6  System.out.println(s);
7  process.waitfor();

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.