我有一个代码,它使用runtime exec获取当前内存使用的explorer.exe,然后调用命令。然后我使用整行并将其转换为字符串变量,我现在希望能够检查此字符串是否发生变化。这是为了检查作为数字的存储器部分是否随时间变化。目的是看是否正在使用资源管理器。只要内存使用没有改变,浏览器就不会被使用,但如果它没有,那就意味着它正在使用中。
命令的通常输出为explorer.exe 776 console 1 35,804K
,然后最后一部分35,804K
是内存输出,这是我想要监视或跟踪的部分。
我目前拥有的代码如下所示。最初我还会实现一个Timer,让它一直运行。
public class ReadProcser {
static String runTVal = "";
public static void main(String[] args) {
try {
functionReadRegular();
} finally {
if (runTVal != runTVal)
{
System.out.println("Changed");
}
}
}
static void functionReadRegular(){
try {
String process;
Process p = Runtime.getRuntime().exec("cmd /c tasklist /FI \"IMAGENAME eq explorer.exe\"");
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((process = input.readLine()) != null) {
runTVal = process;
System.out.println(runTVal);
}
input.close();
} catch (Exception err) {
err.printStackTrace();
}
}
}
我知道检查字符串是否正在改变的当前方式并不起作用。它更多的是展示我想要做的事情,目前它从一开始就没有价值,因此没有任何东西可以比较。但更多的是展示我想要实现的目标。我已经看到有关某个Listener
检查字符串是否已更改的问题,但我不确定如何在这种情况下实际使用它。
如果它在代码中不够可见,它基本上是我想要首先得到的字符串runTVal
,然后保存它然后再次运行代码以获得新值{{ 1}}然后比较旧的和新的。
答案 0 :(得分:0)
我理解它的方式,您希望在循环中比较该CMD命令的输出,随时检查结果。
下面,我修改了您的代码以读取命令的值,等待500毫秒,并将之前的值与新值进行比较。任何字段都可能已更改,而不仅仅是内存。但是,我认为这可能是朝着你想要做的方向迈出的一步。
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class ReadProcser {
private static final int TIME_WAIT = 500;
public static void main(String[] args) {
while (true) {
String val = getRunTVal();
try {
Thread.sleep(TIME_WAIT);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (!val.equals(getRunTVal())) {
System.out.println("Changed");
}
}
}
public static String getRunTVal() {
String runTVal = null;
try {
String process;
Process p = Runtime.getRuntime().exec("cmd /c tasklist /FI \"IMAGENAME eq explorer.exe\"");
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((process = input.readLine()) != null) {
runTVal = process;
System.out.println(runTVal);
}
input.close();
} catch (Exception err) {
err.printStackTrace();
}
return runTVal;
}
}
Tim Biegeleisen提到,有些情况可能并不可靠。例如,如果输出中的内存以外的任何字段发生了更改(例如会话#或空白量),则仍会将“已更改”消息打印到控制台,即使内存保持不变。
我有没有帮助,还是我错过了你的观点?
答案 1 :(得分:-3)
字符串是对象,因此当您调用==或!=时,它们会比较存储在那里的值。例如,整数将保留它们的数字,但是对象会比较一个表示数据存储位置的引用。因此,即使两个字符串都是相同的字,它们也不会相等,因为它们存储在不同的位置。比较它们存储使用的.equals,如if(stringA.equals(stringB))。