天天看點

Java調用DOS指令

Java調用DOS指令 2008年1月19日11:31:08

用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 /c dir”,其中參數“/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( );

...

 注 :以上為轉載

我在測試過程中發現帶顔色的地方的調用的是不能成功執行的,調用的時候都應該加上cmd /c

例如  應該寫成 Process process = Runtime.getRuntime().exec("cmd.exe /c .//p.exe");

                            Process process = Runtime.getRuntime().exec(" .//p.exe"); 這樣是不行的。