2010-12-23 2 views
2

이 문제가 발생합니다.
내 프로그램은 Windows 플랫폼에서 Runtime.getRuntime().exec(cmd);을 호출합니다. 오류 및 출력 스트림을 읽고이 출력을 사용하여 작업을 수행합니다. 이 메소드는 각 4-5 초 후에 루프에서 호출되며 프로그램이 종료 될 때까지 계속됩니다.Runtime.getRuntime(). exec (cmd); 새로운 실행마다 이전 출력을 추가합니까?

이제 출력을 읽을 때마다 이전 출력이 새 출력에 추가되고 각 반복마다 결과가 커집니다. 어쨌든이 일을 막을 수 있습니까? 실행 된 명령은 일부 필터링 매개 변수가있는 "작업 목록"입니다.

이 Runtime.getTuntime(). exec (cmd)에 대한 메소드 (문자열 출력을 반환 함)를 작성했는데 실행 후 프로세스를 닫고 있지만 루프 내에서 이전에 호출 될 때마다 출력이 새로운 것에 추가됩니다. 여기

코드입니다 : 클래스 fList에서

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(); 

} 

} 

는 방법 PLIST입니다 : 모두 여기에 복사 iv'e

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; 
    } 
} 

그렇게 물었다.

+1

출력을 읽는 코드를 게시해야합니다. –

+0

Java 클래스 이름은 대문자 'LikeThis'로 시작해야합니다. 코드를 훨씬 쉽게 읽을 수 있도록하는 규칙입니다. –

답변

1

당신은 oPut에게 static 필드를 만든 - 그 클래스가 eProcList의 모든 새로운 인스턴스간에 공유 다음로드되면 "", 즉 이전 실행의 취소 결코에 초기화. 그것은 static (왜 정적입니까?) 또는 생성자에서 지우지 마십시오.

+0

왜냐하면 나는 컴파일 시간 오류가 있기 때문이다. java.lang.Error : 컴파일되지 않은 컴파일 문제 : \t 비 정적 필드에 대한 정적 참조를 만들 수 없습니다. oPut –

+0

@Sara -'oPut' 및'public String procList()'에서 정적 한정자를 제거하십시오. 그런 다음'static'을 읽어보십시오. http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html –

+0

정말 고맙습니다. 문제가 해결되었습니다. 나는 항상 변수 유형에주의를 기울이지 않고 정적으로 주로 사용했다. 다시 한 번 감사드립니다! 정적 한정자를 제거하는 것 외에도 eProcList.procList를 out = output.procList() + error.procList();로 변경해야했습니다. –

관련 문제