天天看點

Java調用DOS指令方法

使用Java調用DOS指令方法

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

Process process = Runtime.getRuntime().exec(".//p.exe");

process.waitfor( );

...

在上面的程式中,第一行的“.//p.exe”是要執行的程式名,Runtime.getRuntime()傳回目前應用程式的Runtime對象,該對象的exec()方法訓示Java虛拟機建立一個子程序執行指定的可執行程式,并傳回與該子程序對應的Process對象執行個體。通過Process可以控制該子程序的執行或擷取該子程序的資訊。第二條語句的目的等待子程序完成再往下執行。

但在windows平台上,如果處理不當,有時并不能得到預期的結果。下面是筆者在實際程式設計中總結的幾種需要注意的情況:

1、執行DOS的内部指令

如果要執行一條DOS内部指令,有兩種方法。一種方法是把指令解釋器包含在exec()的參數中。例如,執行dir指令,在NT上,可寫成 exec("cmd.exe /c dir"),在windows 95/98下,可寫成“command.exe /cdir”,其中參數“/c”表示指令執行後關閉Dos立即關閉視窗。另一種方法是,把内部指令放在一個批指令my_dir.bat檔案中,在Java 程式中寫成exec("my_dir.bat")。如果僅僅寫成exec("dir"),Java虛拟機則會報運作時錯誤。前一種方法要保證程式的可移植性,需要在程式中讀取運作的作業系統平台,以調用不同的指令解釋器。後一種方法則不需要做更多的處理。

2、打開一個不可執行的檔案

打開一個不可執行的檔案,但該檔案存在關聯的應用程式,則可以有兩種方式。 以打開一個word文檔a.doc檔案為例,Java中可以有以下兩種寫法:

exec("start .//a.doc");

exec(" c://Program Files//Microsoft Office//office//winword.exe .//a.doc");

顯然,前一種方法更為簡捷友善。

3、執行一個有标準輸出的DOS可執行程式

在 windows平台上,運作被調用程式的DOS視窗在程式執行完畢後往往并不會自動關閉,進而導緻Java應用程式阻塞在waitfor()。導緻該現象的一個可能的原因是,該可執行程式的标準輸出比較多,而運作視窗的标準輸出緩沖區不夠大。解決的辦法是,利用Java提供的Process類提供的方法讓 Java虛拟機截獲被調用程式的DOS運作視窗的标準輸出,在waitfor()指令之前讀出視窗的标準輸出緩沖區中的内容。一段典型的程式如下:

...

String ls_1;

Process process = Runtime.getRuntime().exec("cmd /c dir //windows");

BufferedReader bufferedReader = new BufferedReader( /

new InputStreamReader(process.getInputStream());

while ( (ls_1=bufferedReader.readLine()) != null)

System.out.println(ls_1);

process.waitfor( );

...

以上内容為轉載~下面内容為原創!

今天在做用戶端程式的自動更新,簡單描述一下,就是從伺服器上将更新包下載下傳下來,然後在本地解壓縮,最後删掉~功能很簡單~

但是問題出在使用JAVA的ZIP子產品做檔案的解壓縮不是想象的那麼簡單,資源需要釋放,一個不小心就沒有辦法删除掉原有ZIP檔案了~資源的占用确實是個大問題,但是好在,用戶端程式更新完是要重新開機的,一切都煙消雲散了~對于删除不掉ZIP檔案的問題,我也流氓一下~用DEL硬删除~此處一定要注意!

Process process = Runtime.getRuntime().exec("cmd /c del f://aaa.doc");

這樣的調用是沒有問題~

Process process = Runtime.getRuntime().exec("del f://aaa.doc");

這樣寫是不可能對的~