還有許多地方未理解,僅供參考,后續待完善。
參考:https://www.cnblogs.com/xxpal/articles/824963.html
舉例:
Process process; process = Runtime.getRuntime().exec( "cmd /c tasklist|findStr \"Manager\""); try { InputStream inputStream = process.getInputStream(); BufferedReader reader = new BufferedReader( new InputStreamReader(inputStream)); while ((line = reader.readLine()) != null) { Log.info(line); lines=lines+line; } process.waitFor(); } catch (Exception e) { // TODO: handle exception Log.info("查找Manager進程失敗"); Log.info(e.getMessage()); lines="查找Manager進程是否存在失敗"; }
Runtime.getRuntime().exec()方法主要用於執行外部的程序或命令
Runtime.getRuntime()返回當前應用程序的Runtime對象,該對象的exec()方法指示Java虛擬機創建一個子進程執行指定的可執行程序,並返回與該子進程對應的Process對象實例。通過Process可以控制該子進程的執行或獲取該子進程的信息。
通過Process的getInputStream(),getOutputStream()和getErrorStream()方法可以得到輸入輸出流,然后通過InputStream可以得到程序對控制台的輸出信息,通過OutputStream可以給程序輸入指令,這樣就達到了程序的交換功能。
在Windows平台上,運行被調用程序的DOS窗口在程序執行完畢后往往並不會自動關閉,從而導致Java應用程序阻塞在waitfor()語句。導致該現象的一個可能的原因是,該可執行程序的標准輸出比較多,而運行窗口的標准輸出緩沖區不夠大。解決的辦法是,利用Java中Process類提供的方法讓Java虛擬機截獲被調用程序的DOS運行窗口的標准輸出,在waitfor()命令之前讀出窗口的標准輸出緩沖區中的內容。舉例:
InputStream inputStream = process.getInputStream(); BufferedReader reader = new BufferedReader( new InputStreamReader(inputStream)); while ((line = reader.readLine()) != null) { Log.info(line); lines=lines+line; }
記得在最后要添加process.waitFor();代碼的意思是 線程一直到process結束再往下執行。如果不寫這行代碼,那么process執行的同時,線程在往下執行,后面有可能報錯。