所以我有这段代码可以打印出从任务管理器到NetBeans中的ide的正在运行的进程,但是我想扫描进程的输出,以便可以列出当时PC上运行最高的进程?

public static void main(String[] args) throws IOException {
  try {
   String tasklist;
   Process p = Runtime.getRuntime().exec
    (System.getenv("windir") +"\\system32\\"+"tasklist.exe");
    try (BufferedReader input = new BufferedReader(new   InputStreamReader(p.getInputStream()))) {
      while ((tasklist = input.readLine()) != null) {
      System.out.println(tasklist); //<-- Parse data here.
  }
}
} catch (IOException err) {
  err.printStackTrace();
}
}

例如,这给了我下面的输出,如果我想杀死netbeans,因为它运行了500,000k以上,我该怎么做?
Image Name                     PID Session Name        Session    Mem Usage

chrome.exe                    3464 Console                    3    159,672 K
netbeans64.exe                3664 Console                    3    592,216 K
chrome.exe                    3808 Console                    3    384,556 K
java.exe                      2040 Console                    3     36,732 K
tasklist.exe                  2208 Console                    3      6,196 K

最佳答案

您迭代该数据;并收集您感兴趣的那些属性;例如名称,PID,当然还有内存用法。

您可能会创建一个类似的类

public class RunningProcessInfo {
  private final String name ...

  public RunningProcessInfo(String name, int pid, int memUsage) {

换句话说:您编写的解析代码将一行作为

chrome.exe 3464控制台3 159,672 K

并把它变成
new RunningProcessInfo("chrome.exe", 3464, 159672)

(通过分析字符串输入;将“3464”之类的字符串转换为数字,依此类推)。

含义:您将System.out.println(tasklist);行替换为
processInfos.add( parseLine(tasklist) );

其中processInfos是某种ArrayList<RunningProcessInfo>,而parseLine()是这种方法,该方法只占用一行并获取数据以构建新的RunningProcessInfo对象。

您将这些对象收集在列表中。然后,您可以迭代该列表以查找满足特定条件的所有对象。

最后,您使用另一个流程生成器发送命令,以杀死要杀死的PID(有关方法,请参见here)。当然,您要注意-因为您肯定不想在该会话运行程序时杀死netbeans会话,所以...

08-26 18:04
查看更多