2010-12-23 52 views
2

我遇到了這個問題。
我的程序在Windows平臺上調用Runtime.getRuntime().exec(cmd);。我讀了錯誤和輸出流,並對此輸出做了些什麼。這個方法在每4-5秒之後被循環調用,直到程序終止。Runtime.getRuntime()。exec(cmd);在每個新的執行過程中追加前一個輸出?

現在發生了什麼,每當我讀取輸出時,先前的輸出將被附加到新的輸出中,並且每次迭代時結果越來越大。無論如何要阻止這件事。執行的命令是帶有一些過濾參數的「tasklist」。

我爲此Runtime.getTuntime()。exec(cmd)創建了一個方法(它返回String輸出),其中我也在執行後關閉了進程,但是當它從循環內部調用時,輸出附加到新的。

下面是代碼:

class Track implements Runnable { 

static int size = 0; 

public void run() { 

    String cmd1 = "tasklist /fo list /fi \"imagename eq java.exe\""; 
    String cmd2 = "tasklist /fo list /fi \"imagename eq javaw.exe\""; 
    String text = ""; 
    int i=1, j=0; 

    while(size < 100000){ 

     try{ 
      text = fList.pList(cmd2, 1); 
      if (text.indexOf("javaw.exe")== -1){ 
       text = fList.pList(cmd1, 1); 
      } 
      if(j==22) System.out.println(text); 
      if (text.charAt(0)!= '0') continue; 
      i = text.lastIndexOf("Mem Usage: ")+14; 
      text = text.substring(i); 
      text = text.substring(0,text.lastIndexOf(" K")); 
      text = text.replaceFirst(",", ""); 
      size = Integer.parseInt(text); 
      System.out.println(size); 
      Thread.sleep(3000); 
      j++; 

     } catch(Exception e){ 
      System.out.println(e); 
     } 
    } 
    System.out.println("Memory utlization exceeded the permissible limit"); 
    System.out.println("Now terminating the Program\n"); 
    System.exit(1); 


} 

static void memoryCheck(int size) throws Exception{ 

    (new Thread(new Track())).start(); 

} 

} 

類FLIST是方法的plist:

static String pList(String cmd, int eval) throws Exception{ //can execute external command 

    String out = ""; 
    int val = 5; // should not be zero, to verify returned code zero for normal exec. 
    try 
    {    
     //String osName = System.getProperty("os.name"); 

     Runtime rt = Runtime.getRuntime(); 
     Process proc = rt.exec(cmd); 
     // any error message? 
     eProcList error = new eProcList(proc.getErrorStream());    

     // any output? 
     eProcList output = new eProcList(proc.getInputStream()); 

     // kick them off 
     error.start(); 
     output.start(); 


     // any error??? 
     int exitVal = proc.waitFor(); 
     out = eProcList.procList(); 
     val = exitVal;   
     proc.destroy(); 
     proc.getInputStream().close(); 
     proc.getErrorStream().close(); 

    } catch (Throwable t) 
    { 
     t.printStackTrace(); 
    } 
    if (eval==1) return val + out; 
     return out; 
} 

class eProcList extends Thread 
{ 
    InputStream iStream; 
    static String oPut = ""; 
    eProcList(InputStream iStream) 
    { 
     this.iStream = iStream; 
    } 

    public void run() 
    { 
     try 
     { 
      InputStreamReader isr = new InputStreamReader(iStream); 
      BufferedReader br = new BufferedReader(isr); 
      String line=null; 
      while ((line = br.readLine()) != null) 
       oPut = oPut + line+"\n"; 
      } catch (IOException e) 
       { 
       e.printStackTrace(); 
       } 
    } 

    static public String procList(){ 
     return oPut; 
    } 
} 

你問這麼iv'e複製都在這裏。

+1

您應該發佈負責讀取輸出的代碼。 – 2010-12-23 04:17:43

+0

Java類名應該以大寫字母`LikeThis`開頭。這是一個讓代碼更易於閱讀的約定。 – 2010-12-23 04:46:37

回答

1

你讓oPut一個static場 - 其初始化爲""一次上課的時候被加載,然後的eProcList每一個新的實例之間共享,即不會被清零之前的運行。要麼不使它static(爲什麼它是靜態的?)或在構造函數中清除它。

相關問題