研究java.lang.Process類

1、概述
      Process類是一個抽象類(全部的方法均是抽象的),封裝了一個進程(即一個執行程序)。
      Process 類提供了執行從進程輸入、執行輸出到進程、等待進程完成、檢查進程的退出狀態以及銷燬(殺掉)進程的方法。
      ProcessBuilder.start() 和 Runtime.exec 方法建立一個本機進程,並返回 Process 子類的一個實例,該實例可用來控制進程並獲取相關信息。
      建立進程的方法可能沒法針對某些本機平臺上的特定進程很好地工做,好比,本機窗口進程,守護進程,Microsoft Windows 上的 Win16/DOS 進程,或者 shell 腳本。建立的子進程沒有本身的終端或控制檯。它的全部標準 io(即 stdin,stdout,stderr)操做都將經過三個流 (getOutputStream(),getInputStream(),getErrorStream()) 重定向到父進程。父進程使用這些流來提供到子進程的輸入和得到從子進程的輸出。由於有些本機平臺僅針對標準輸入和輸出流提供有限的緩衝區大小,若是讀寫子進程的輸出流或輸入流迅速出現失敗,則可能致使子進程阻塞,甚至產生死鎖。
      當沒有 Process 對象的更多引用時,不是刪掉子進程,而是繼續異步執行子進程。
2、API預覽
 destroy() 
   殺掉子進程。 
 exitValue() 
   返回子進程的出口值。 
 InputStream getErrorStream() 
   得到子進程的錯誤流。 
 InputStream getInputStream() 
   得到子進程的輸入流。 
 OutputStream getOutputStream() 
   得到子進程的輸出流。 
 waitFor() 
   致使當前線程等待,若是必要,一直要等到由該 Process 對象表示的進程已經終止。
3、如何建立Process對象,通常有一下兩種方法:
一、每一個 ProcessBuilder 實例管理一個進程屬性集。start() 方法利用這些屬性建立一個新的 Process 實例。start() 方法能夠從同一實例重複調用,以利用相同的或相關的屬性建立新的子進程。(ProcessBuilder這個是JDK5中新添加的final類,詳細請參看「深刻研究java.lang.ProcessBuilder類」一文。
二、Runtime.exec() 方法建立一個本機進程,並返回 Process 子類的一個實例。詳細請參看「深刻研究java.lang.Runtime類」一文。
4、實例
 
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();          }  }
相關文章
相關標籤/搜索