调用Runtime.getRuntime()EXEC(CMD)。在每次新执行时追加上一个输出?

时间:2010-12-23 04:13:28

标签: java runtime.exec

我遇到了这个问题 我的程序在Windows平台上调用Runtime.getRuntime().exec(cmd);。我读取了错误和输出流,并对此输出执行了一些操作。此方法在每4-5秒后在循环中调用,并继续执行直到程序终止。

现在发生了什么,每当我读取输出时,先前的输出被附加到新输出,因此每次迭代结果越来越大。反正有没有阻止这件事。执行的命令是带有一些过滤参数的“任务列表”。

我为此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;
    }
}

你这么问,我在这里复制了所有。

1 个答案:

答案 0 :(得分:1)

您将oPut作为static字段 - 在加载类时将其初始化为"",然后在eProcList的每个新实例之间共享,即从未清除上一次运行。要么不使static(为什么它是静态的?)或在构造函数中清除它。