Java获取所有正在运行的进程

1. 简介

在Java中,我们可以使用ProcessBuilder类和Runtime类来获取系统中正在运行的进程。ProcessBuilder类提供了创建、启动和管理子进程的方法,而Runtime类则提供了执行系统命令的方法。本文将详细介绍如何使用这两个类来获取正在运行的进程。

2. 流程概述

下表展示了获取正在运行的进程的整个流程:

步骤 描述
步骤 1 创建ProcessBuilder对象
步骤 2 设置要执行的命令
步骤 3 启动命令
步骤 4 获取命令执行的结果
步骤 5 解析命令执行的结果

下面将逐步介绍每个步骤所需要做的事情,并提供相应的代码示例和注释。

3. 代码实现

步骤 1:创建ProcessBuilder对象

我们首先需要创建一个ProcessBuilder对象,用于设置要执行的命令并启动子进程。

ProcessBuilder processBuilder = new ProcessBuilder();

步骤 2:设置要执行的命令

然后,我们需要设置要执行的命令。在这个例子中,我们将使用"tasklist"命令来获取正在运行的进程列表。

processBuilder.command("tasklist");

步骤 3:启动命令

接下来,我们需要启动命令,并等待命令执行完成。

Process process = processBuilder.start();
int exitCode = process.waitFor();

步骤 4:获取命令执行的结果

在命令执行完成后,我们需要获取命令执行的结果。我们可以使用Process.getInputStream()方法获取命令的标准输出流,并将其转换为可读的字符串。

String output = readStream(process.getInputStream());

下面是一个辅助方法readStream()的实现,用于将输入流转换为字符串:

private String readStream(InputStream inputStream) throws IOException {
    StringBuilder result = new StringBuilder();
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    String line;
    while ((line = reader.readLine()) != null) {
        result.append(line).append(System.lineSeparator());
    }
    return result.toString();
}

步骤 5:解析命令执行的结果

最后,我们需要解析命令执行的结果,提取出正在运行的进程信息。在这个例子中,我们可以通过解析输出字符串来获取进程列表。

List<String> processList = parseProcessList(output);

下面是一个辅助方法parseProcessList()的实现,用于解析输出字符串并返回进程列表:

private List<String> parseProcessList(String output) {
    List<String> processList = new ArrayList<>();
    String[] lines = output.split(System.lineSeparator());
    for (int i = 3; i < lines.length; i++) {
        String[] columns = lines[i].trim().split("\\s+");
        processList.add(columns[0]);
    }
    return processList;
}

4. 示例

下面是一个完整的示例,展示了如何使用上述代码来获取正在运行的进程列表:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class ProcessListExample {

    public static void main(String[] args) {
        try {
            ProcessBuilder processBuilder = new ProcessBuilder();
            processBuilder.command("tasklist");
            
            Process process = processBuilder.start();
            int exitCode = process.waitFor();
            
            String output = readStream(process.getInputStream());
            
            List<String> processList = parseProcessList(output);
            
            System.out.println("正在运行的进程列表:");
            for (String processName : processList) {
                System.out.println(processName);
            }
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }

    private static String readStream(InputStream inputStream) throws IOException {
        StringBuilder result = new StringBuilder();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        String line;
        while ((line = reader.readLine()) != null) {
            result.append(line).append(System.lineSeparator());
        }
        return result.toString();
    }

    private static List<String> parseProcessList(String output)