一、概述
Process類是一個抽象類別(所有的方法均是抽象的),封裝了一個進程(即一個執行程式)。
Process 類提供了執行從進程輸入、執行輸出到進程、等待進程完成、檢查進程的退出狀態以及銷毀(殺掉)進程的方法。
ProcessBuilder.start() 和 Runtime.exec 方法建立一個本機進程,並返回 Process 子類的一個執行個體,該執行個體可用來控制進程並擷取相關資訊。
建立進程的方法可能無法針對某些本機平台上的特定進程很好地工作,比如,本機視窗進程,守護進程,Microsoft Windows 上的 Win16/DOS 進程,或者 shell 指令碼。建立的子進程沒有自己的終端或控制台。它的所有標準 io(即 stdin,stdout,stderr)操作都將通過三個流 (getOutputStream(),getInputStream(),getErrorStream())
重新導向到父進程。父進程使用這些流來提供到子進程的輸入和獲得從子進程的輸出。因為有些本機平台僅針對標準輸入和輸出資料流提供有限的緩衝區大小,如果讀寫子進程的輸出資料流或輸入資料流迅速出現失敗,則可能導致子進程阻塞,甚至產生死結。
當沒有 Process 對象的更多引用時,不是刪掉子進程,而是繼續非同步執行子進程。
二、API預覽
destroy()
殺掉子進程。
exitValue()
返回子進程的出口值。
InputStream getErrorStream()
獲得子進程的錯誤流。
InputStream getInputStream()
獲得子進程的輸入資料流。
OutputStream getOutputStream()
獲得子進程的輸出資料流。
waitFor()
導致當前線程等待,如果必要,一直要等到由該 Process 對象表示的進程已經終止。
三、如何建立Process對象,一般有一下兩種方法:
1、每個 ProcessBuilder 執行個體管理一個進程屬性集。start() 方法利用這些屬性建立一個新的 Process 執行個體。start() 方法可以從同一執行個體重複調用,以利用相同的或相關的屬性建立新的子進程。(ProcessBuilder這個是JDK5中新添加的final類,詳細請參看“深入研究java.lang.ProcessBuilder類”一文。
2、Runtime.exec() 方法建立一個本機進程,並返回 Process 子類的一個執行個體。詳細請參看“深入研究java.lang.Runtime類”一文。
四、執行個體
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* 控制台處理工具箱
*
* @author leizhimin 2009-6-25 14:12:14
*/
public final class CmdToolkit {
private static Log log = LogFactory.getLog(CmdToolkit.class);
private CmdToolkit() {
}
/**
* 讀取控制命令的輸出結果
*
* @param cmd 命令
* @param isPrettify 返回的結果是否進行美化(換行),美化意味著換行,預設不進行美化,當此參數為null時也不美化,
* @return 控制命令的輸出結果
* @throws IOException
*/
public static String readConsole(String cmd, Boolean isPrettify) throws IOException
{
StringBuffer cmdout = new StringBuffer();
log.info("執行命令:" + cmd);
Process process = Runtime.getRuntime().exec(cmd); //執行一個系統命令
InputStream fis = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String line = null;
if (isPrettify == null || isPrettify) {
while ((line = br.readLine()) != null) {
cmdout.append(line);
}
} else {
while ((line = br.readLine()) != null) {
cmdout.append(line).append(System.getProperty("line.separator"));
}
}
log.info("執行系統命令後的結果為:\n" + cmdout.toString());
return cmdout.toString().trim();
}
}