检查字符串值是否更改

时间:2017-01-30 01:42:32

标签: java string variables compare runtime

我有一个代码,它使用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}}然后比较旧的和新的。

2 个答案:

答案 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))。