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複製都在這裏。
您應該發佈負責讀取輸出的代碼。 – 2010-12-23 04:17:43
Java類名應該以大寫字母`LikeThis`開頭。這是一個讓代碼更易於閱讀的約定。 – 2010-12-23 04:46:37