Runtime.getRuntime.exec操縱其他程式
用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( );
...
...
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( );
...
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29900383/viewspace-1698157/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 分析:操縱的藝術
- JavaScript也能操縱cookie函式JavaScriptCookie函式
- 線上社交網路中的操縱武器
- 用JDBC操縱BLOB和CLOB資料JDBC
- 節操,程式碼,修養,妹子和其他(Go語言版)Go
- 影片操縱中的新AI技術轉向AI
- 我發現我的資料被操縱了……
- Python爬蟲教程-28-Selenium 操縱 ChromePython爬蟲Chrome
- 視訊操縱中的新AI技術轉向AI
- 4. mysql資料庫操縱常用命令MySql資料庫
- JavaScript視窗功能指南之操縱視窗 (轉)JavaScript
- Google操縱調查內幕才超越百度?Go
- JDBC:java提供的專門操縱資料庫的APIJDBCJava資料庫API
- 谷歌釋出最新移動操縱系統 Android 4.1谷歌Android
- 使用ADO.NET輕鬆操縱資料庫(一)資料庫
- 使用ADO.NET輕鬆操縱資料庫(二)資料庫
- “操縱大選”的劍橋分析被封禁,核心員工卻早已洗白上岸重操舊業
- MySQL教程DML資料操縱語言示例詳解鍵塾MySql
- Threes.js入門篇之5 - 場景操縱器TrackballJS
- 研究:比特幣揭露央行貨幣操縱和資本管制比特幣
- 急急急!如何用java操縱outlook地址本檔案pst?Java
- 影象操縱大師Xfermode講解與實戰——Android高階UIAndroidUI
- 影像操縱大師Xfermode講解與實戰——Android高階UIAndroidUI
- MYSQL中的DDL(用來操縱資料庫物件的語言)1MySql資料庫物件
- 第一篇:操縱MySQL資料庫(1) - 基於MySQLdb庫MySql資料庫
- ASPOSE.Cells & ASPOSE.Words 操縱Excel和Word文件的 .NET Core 例項Excel
- C#多執行緒學習(二) 如何操縱一個執行緒C#執行緒
- 為什麼沒有普及128位操縱系統的計算機?計算機
- cmd 命令操縱檔案管理器、建立(刪除)多級資料夾
- 蘋果被指操縱AppStore榜單偏袒自家應用進前10蘋果APP
- C# 多執行緒學習(2) :如何操縱一個執行緒C#執行緒
- 操縱瀏覽器歷史記錄 : popstate() 、 history.pushState() 、 window.history.pushState()瀏覽器
- 紙貴科技揮刀:操縱三家平臺,割完幣圈割數藏
- 第二篇:操縱MySQL資料庫(2) - 基於ORM思想的SQLAlchemy庫MySql資料庫ORM
- 自己動手寫Web自動化測試框架(2):開啟和操縱IEWeb框架
- 自己動手寫Web自動化測試框架(3):操縱Web控制元件Web框架控制元件
- 操縱歷史,利用HTML5 History API實現無重新整理跳轉HTMLAPI
- 對話心動創始人黃一孟:做遊戲不是去理解和操縱人性遊戲