Java Runtime.exec() 使用

jopen 10年前發布 | 27K 次閱讀 Java Java開發

每個 Java 應用程序都有一個 Runtime 類實例,使應用程序能夠與其運行的環境相連接。可以通過 getRuntime 方法獲取當前運行時。 應用程序不能創建自己的 Runtime 類實例。我們可以通過  Runtime.exec()用來執行外部程序或命令

Runtime.exec() 有四種調用方法
    * public Process exec(String command);
    * public Process exec(String [] cmdArray);
    * public Process exec(String command, String [] envp);
    * public Process exec(String [] cmdArray, String [] envp);

 

下面通過一個Demo來 展示 如何用Java來調用Windows上的wmic命令來獲取系統中當前的進程信息。

    import java.io.BufferedReader;  
    import java.io.IOException;  
    import java.io.InputStream;  
    import java.io.InputStreamReader;  

    public class RuntimeExecTest {  

        /** 
         * @param args 
         */  
        public static void main(String[] args) {  

            test();  
        }  

        private static void test() {  

            String[] cmd = new String[] { "cmd.exe", "/C", "wmic process get name" };    
            try {    
                Process process = Runtime.getRuntime().exec(cmd);    

                new Thread(new SerializeTask(process.getInputStream())).start();    
                new Thread(new SerializeTask(process.getErrorStream())).start();    

                process.getOutputStream().close();    

                int exitValue = process.waitFor();    
                System.out.println("返回值:" + exitValue);    
            } catch (Exception e) {    
                e.printStackTrace();    
            }    
        }  
    }  

    class SerializeTask implements Runnable{  
        private InputStream in;  

        public SerializeTask(InputStream in) {  
            this.in = in;  
        }  

        @Override  
        public void run() {  
            BufferedReader br = null;  
            try {  
                br = new BufferedReader(new InputStreamReader(in));    
                String line = null;    
                while ((line = br.readLine()) != null) {    
                    System.out.println(line);    
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            }finally{  
                try {  
                    if(br!=null)  
                        br.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  

    }  

注意事項

  • 等待命令執行結束用waitFor(),其返回值就是命令的返回值。
  • 如果出現程序執行被掛起,沒有任何反應的情況,是由于沒有讀取命令子進程的正常輸出流或錯誤輸出流導致緩沖區被占滿,進程被鎖住。這個時候需要把輸出流中的內容給讀出來。最好的做法是使用兩個線程,分別同時讀取正常輸出流和錯誤輸出流。
  • 執行Windows平臺上的命令時使用cmd.exe /C,如cmd.exe /C dir。
  • 記得關閉命令子進程的輸出流,通過Process.getOutputStream().close(),這樣不會導致命令子進程被鎖住。
  • Runtime.exec() 不等同于直接執行command line命令。Runtime.exec()很有局限性,對有些命令不能直接把command line里的內容當作String參數傳給exec().比如重定向等命令。舉個例子:javap -l xxx > output.txt。這時要用到exec的第二種重載,即input 參數為String[]:Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c","javap -l xxx > output.txt"});

 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!