检查字符串值是否改变

Check if string value changes

我有一个代码可以获取 explorer.exe 的当前内存使用情况,使用 运行time exec 然后调用一个命令。然后我使用整行并将其变成一个字符串变量,我现在希望能够检查这个字符串是否发生了变化。这是为了检查作为数字的记忆部分是否随时间变化。整个目的是查看是否正在使用资源管理器。只要内存使用没有发生变化,资源管理器就不会在使用中,但如果发生变化,则意味着它正在使用中。

命令的通常输出是explorer.exe 776 console 1 35,804K,然后最后一部分35,804K是内存输出,这是我想监视或跟踪的部分。

我目前拥有的代码如下所示。最初我也会实现一个计时器,让它一直 运行。

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,然后保存,然后再运行代码重新获取一个新的值为 runTVal 然后比较旧的和新的。

字符串是对象,所以当您调用 == 或 != 时,它们会比较存储在那里的值。例如,整数会保存它们的数量,但对象会比较一个说明其数据存储位置的引用。因此,即使两个字符串是同一个词,它们也不会相等,因为它们存储在不同的位置。要比较它们存储的内容,请使用 .equals,如 if(stringA.equals(stringB)).

按照我的理解,您希望在循环中与该 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 提到的,在某些情况下这可能不可靠。例如,如果输出中除内存之外的任何字段发生更改(例如会话号或空格数量),消息 "Changed" 仍将打印到控制台,即使内存保持不变。

我有帮助吗,还是我没听懂你的意思?