如何使用java.lang.ProcessBuilder启动新进程?
下文笔者讲述使用ProcessBuilder启动新进程的方法及示例分享,如下所示
java.lang.ProcessBuilder简介
java.lang.ProcessBuilder`是Java 中用于创建和启动外部进程的核心工具类
它提供灵活方式来配置进程的启动参数、环境变量、工作目录等
java.lang.ProcessBuilder作用
`ProcessBuilder` 的功能是
构建并启动一个新的操作系统进程**(如执行命令行命令、调用其他可执行文件等)
可使用 `ProcessBuilder` 进行以下操作
- 指定进程的启动命令及参数;
- 设置进程的工作目录;
- 配置进程的环境变量;
- 重定向进程的输入/输出流(如将输出打印到控制台、写入文件等);
- 启动进程并获取其运行状态。
java.lang.ProcessBuilder使用步骤
1. 创建 `ProcessBuilder` 实例:
传入命令及参数(命令为字符串数组或可变参数);
2. 可选)配置进程属性:
如工作目录、环境变量、输入输出重定向等;
3. 启动进程:
调用 `start()` 方法,返回 `Process` 对象(代表正在运行的进程);
4. (可选)处理进程的输入/输出:
使用 `Process` 对象获取输入流(进程的输出)、输出流(进程的输入)、错误流(进程的错误输出);
5. (可选)等待进程结束:
调用 `Process.waitFor()` 方法,阻塞当前线程直到进程执行完成;
6. 获取进程退出码:
通过 `Process.exitValue()` 获取进程的退出状态(0 表示成功,非 0 表示失败)。
例
启动简单命令(执行 `ls -l` 或 `dir`)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class ProcessBuilderDemo {
public static void main(String[] args) {
try {
// 1. 创建 ProcessBuilder 实例(Windows 用 "cmd", "/c", "dir";Linux/macOS 用 "ls", "-l")
ProcessBuilder pb = new ProcessBuilder("ls", "-l");
// 2. (可选)设置工作目录(默认是当前 JVM 的 user.dir)
pb.directory(new java.io.File("/home/user/documents"));
// 3. 启动进程
Process process = pb.start();
// 4. 处理进程的输出(重要:必须读取输出/错误流,否则进程可能阻塞)
printStream(process.getInputStream(), "输出");
printStream(process.getErrorStream(), "错误");
// 5. 等待进程执行完成(阻塞当前线程)
int exitCode = process.waitFor();
System.out.println("\n进程退出码:" + exitCode);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
// 打印输入流内容(如进程的输出/错误信息)
private static void printStream(InputStream is, String type) throws IOException {
try (BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(type + ": " + line);
}
}
}
}
例 2:启动新 JVM 进程(指定 `user.dir`)
通过 `ProcessBuilder` 启动一个新的 Java 进程,
并指定其 `user.dir`(模拟修改工作目录):
public class StartNewJvmProcess {
public static void main(String[] args) {
try {
// 1. 定义新进程的启动命令(执行一个打印 user.dir 的 Java 类)
String javaHome = System.getProperty("java.home");
String javaExe = javaHome + "/bin/java"; // Java 可执行文件路径
String classPath = System.getProperty("java.class.path"); // 类路径(当前项目的 classpath)
String mainClass = "PrintUserDir"; // 要执行的主类
// 2. 创建 ProcessBuilder,传入命令及参数(包括 -Duser.dir 指定新工作目录)
ProcessBuilder pb = new ProcessBuilder(
javaExe,
"-Duser.dir=/home/user/new-working-dir", // 新进程的 user.dir
"-cp", classPath,
mainClass
);
// 3. 启动进程并处理输出
Process process = pb.start();
printStream(process.getInputStream(), "新进程输出");
printStream(process.getErrorStream(), "新进程错误");
// 4. 等待进程结束并获取退出码
int exitCode = process.waitFor();
System.out.println("新进程退出码:" + exitCode);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
// 辅助方法:打印流内容(同示例 1)
private static void printStream(InputStream is, String type) throws IOException {
// 实现同示例 1
}
}
// 新进程要执行的主类(需放在 classpath 下)
class PrintUserDir {
public static void main(String[] args) {
System.out.println("新进程的 user.dir:" + System.getProperty("user.dir"));
}
}
例 3:配置环境变量
为新进程添加自定义环境变量:
public class ProcessWithEnv {
public static void main(String[] args) {
try {
ProcessBuilder pb = new ProcessBuilder("echo", "%MY_VAR%"); // Windows 用 %变量名%;Linux/macOS 用 $变量名
// 获取当前进程的环境变量,添加自定义变量
java.util.Map env = pb.environment();
env.put("MY_VAR", "Hello from ProcessBuilder!");
// 启动进程并打印输出
Process process = pb.start();
printStream(process.getInputStream(), "输出");
process.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
// 辅助方法:打印流内容(同示例 1)
private static void printStream(InputStream is, String type) throws IOException {
// 实现同示例 1
}
}
ProcessBuilder总结
`ProcessBuilder` 是 Java 中启动外部进程的强大工具,核心步骤为: 1. 构建 `ProcessBuilder` 并指定命令; 2. 配置工作目录、环境变量等(可选); 3. 启动进程并处理输入/输出流; 4. 等待进程完成并获取退出码。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


