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)