程式扎記: [ Java代碼範本 ] 利用 Java 執行 Console 下的命令

標籤

2010年8月24日 星期二

[ Java代碼範本 ] 利用 Java 執行 Console 下的命令

Sample Code: 
This sample will execute the App:NICConfig.exe under Disk D. (陽春版) 

  1. package gays.runtime;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStreamReader;  
  6.   
  7. public class CallingCMD_Sample {  
  8.       
  9.       
  10.     public static void main(String args[]){  
  11.         StringBuffer commandLine = new StringBuffer("D:\\NICConfig.exe \"LocalNetwork\" STATUS");  
  12.         //StringBuffer commandLine = new StringBuffer("cmd");  
  13.         try{  
  14.             Runtime rt = Runtime.getRuntime();  
  15.             Process p = rt.exec(commandLine.toString());      
  16.             BufferedReader input = new BufferedReader(new InputStreamReader(p  
  17.                     .getInputStream()));  
  18.             String line=null;  
  19.             while ((line = input.readLine()) != null) {  
  20.                 System.out.println(line);  
  21.             }  
  22.             input.close();            
  23.             System.out.print("========================================================================");  
  24.         }catch(IOException ioe){  
  25.             ioe.printStackTrace();  
  26.         }  
  27.           
  28.     }  
  29.   
  30. }  
但其實上面程式在執行後, 如果有錯誤輸出到 Stderr 就會 hang 住, 主要是因為沒有對 Stderr 的輸出進行處理, 因此上面代碼可以改良成使用兩支 Thread 分別來處理 std 與 stderr 的輸出 : 
- _StreamGobbler.java 代碼 : 使用來處理 Stderr/ Std 的輸出 
  1. /* 
  2. * To change this template, choose Tools | Templates 
  3. * and open the template in the editor. 
  4. */  
  5. package flib.util.inner;  
  6.   
  7. import flib.util.inner.enums.EStreamType;  
  8. import java.io.*;  
  9.   
  10. /** 
  11. * 
  12. * @author John-Lee 
  13. */  
  14. public class _StreamGobbler extends Thread {  
  15.   
  16.     InputStream is;  
  17.     EStreamType type;   
  18.     private boolean isShow = true;  
  19.   
  20.     public _StreamGobbler(InputStream is, EStreamType type) {  
  21.         this.is = is;  
  22.         this.type = type;  
  23.     }  
  24.   
  25.     public _StreamGobbler(InputStream is, EStreamType type, boolean isShow) {  
  26.         this(is, type);  
  27.         this.isShow = isShow;  
  28.     }  
  29.   
  30.     public void run() {  
  31.         try {  
  32.             InputStreamReader isr = new InputStreamReader(is);  
  33.             BufferedReader br = new BufferedReader(isr);  
  34.             String line = null;  
  35.             while ((line = br.readLine()) != null) {  
  36.                 if(isShow) {  
  37.                     System.out.println(type.toString() + ">" + line);  
  38.                 }  
  39.                 System.out.flush();  
  40.             }  
  41.         } catch (IOException ioe) {  
  42.             ioe.printStackTrace();  
  43.         }  
  44.     }  
  45.   
  46.     /** 
  47.      * @return the isShow 
  48.      */  
  49.     public boolean isIsShow() {  
  50.         return isShow;  
  51.     }  
  52.   
  53.     /** 
  54.      * @param isShow the isShow to set 
  55.      */  
  56.     public void setIsShow(boolean isShow) {  
  57.         this.isShow = isShow;  
  58.     }          
  59. }  
- EStreamType.java 代碼 : 
  1. /* 
  2. * To change this template, choose Tools | Templates 
  3. * and open the template in the editor. 
  4. */  
  5.   
  6. package flib.util.inner.enums;  
  7.   
  8. /** 
  9. * 
  10. * @author John-Lee 
  11. */  
  12. public enum EStreamType {  
  13.     OUTPUT("STDOUT"),ERROR("STDERR");  
  14.     private String msg;  
  15.     private EStreamType(String m) {  
  16.         msg = m;  
  17.     }  
  18.     public String toString() {  
  19.         return msg;  
  20.     }  
  21.     public String getMsg() {  
  22.         return msg;  
  23.     }  
  24. }  
- Test3.java 代碼 : 測試 Main 類 
  1. package ts.test;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5.   
  6. public class Test3 {  
  7.     public static void main(String args[]) {  
  8.         try {  
  9.             String cmdline = "ipconfig";  
  10.             boolean isShow = true;  
  11.             StringBuffer res = new StringBuffer("");  
  12.             Runtime runtime = Runtime.getRuntime();  
  13.             Process process = null;              
  14.             BufferedReader sb = null;  
  15.             process = runtime.exec(cmdline);  
  16.   
  17.             // any error message?  
  18.             _StreamGobbler errorGobbler = new _StreamGobbler(process.getErrorStream(), EStreamType.ERROR, isShow);  
  19.             // any output?  
  20.             _StreamGobbler outputGobbler = new _StreamGobbler(process.getInputStream(), EStreamType.OUTPUT, isShow);  
  21.   
  22.             // kick them off  
  23.             errorGobbler.start();  
  24.             outputGobbler.start();  
  25.             process.getOutputStream().flush();  
  26.             process.getOutputStream().close();  
  27.             int exitCode = process.waitFor();  
  28.             //System.out.println("ExitValue: " + exitVal);  
  29.         } catch (InterruptedException e) {  
  30.             e.printStackTrace();  
  31.         } catch (IOException ioe) {  
  32.             ioe.printStackTrace();  
  33.         }  
  34.     }  
  35. }  
補充說明 : 
* java 調用 Windows 下 DOS 命令 wmic 奇怪現象 
* Java編程 - WMIC的和Java 

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!