在Java的多进程开发场景中,ProcessBuilder提供了比Runtime.exec更丰富的进程控制能力,尤其是在多进程变量控制和IO重定向方面表现突出,能够满足复杂业务下的进程管理需求。

ProcessBuilder基础概念
ProcessBuilder是Java 5引入的进程构建器,用于创建和管理操作系统进程。它允许开发者配置进程的环境变量、工作目录、IO流等参数,最终通过start方法启动进程并返回Process对象,方便后续对进程进行监控和控制。
核心构造方法
ProcessBuilder的构造方法接收一个字符串列表,列表的第一个元素是要执行的命令,后续元素是命令的参数:
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ProcessBuilderDemo {
public static void main(String[] args) {
// 构造命令列表,执行查看系统环境变量的命令
List<String> command = new ArrayList<>();
command.add("cmd");
command.add("/c");
command.add("set");
ProcessBuilder pb = new ProcessBuilder(command);
}
}
多进程变量控制
ProcessBuilder提供了环境变量和工作目录的配置能力,能够灵活控制启动的进程的运行环境。
环境变量控制
可以通过environment方法获取进程的环境变量映射,对其进行增删改操作,这些修改只会影响当前ProcessBuilder启动的进程,不会修改系统全局环境变量。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class EnvControlDemo {
public static void main(String[] args) throws IOException {
List<String> command = new ArrayList<>();
command.add("cmd");
command.add("/c");
command.add("echo %CUSTOM_VAR%");
ProcessBuilder pb = new ProcessBuilder(command);
// 获取环境变量映射
Map<String, String> env = pb.environment();
// 添加自定义环境变量
env.put("CUSTOM_VAR", "test_value");
// 启动进程
Process process = pb.start();
// 读取进程输出
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
}
}
工作目录控制
通过directory方法可以设置进程的工作目录,进程启动后会在该目录下执行命令,默认工作目录是当前Java程序的工作目录。
import java.io.File;
import java.io.IOException;
public class WorkDirDemo {
public static void main(String[] args) throws IOException {
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "dir");
// 设置工作目录为D盘根目录
pb.directory(new File("D:/"));
Process process = pb.start();
// 等待进程执行完成
try {
int exitCode = process.waitFor();
System.out.println("进程退出码:" + exitCode);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
IO重定向实现
ProcessBuilder支持对进程的标准输入、标准输出、标准错误流进行重定向,不需要手动处理流拷贝,使用起来更加便捷。
标准输出重定向到文件
通过redirectOutput方法可以将进程的标准输出重定向到指定文件,支持覆盖和追加两种模式。
import java.io.File;
import java.io.IOException;
public class OutputRedirectDemo {
public static void main(String[] args) throws IOException {
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "echo 这是重定向的输出内容");
// 将标准输出重定向到output.txt,默认是覆盖模式
pb.redirectOutput(new File("output.txt"));
// 如果需要追加模式,可以使用redirectOutput(ProcessBuilder.Redirect.appendTo(new File("output.txt")))
Process process = pb.start();
try {
process.waitFor();
System.out.println("输出已重定向到output.txt文件");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
标准错误流重定向到标准输出
可以将标准错误流合并到标准输出流,方便统一处理进程的输出信息,避免错误流未被读取导致进程阻塞。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ErrorRedirectDemo {
public static void main(String[] args) throws IOException {
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "echo 正常输出 & invalid_command");
// 将标准错误流重定向到标准输出流
pb.redirectErrorStream(true);
Process process = pb.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
}
}
标准输入重定向到文件
通过redirectInput方法可以将进程的标准输入重定向到指定文件,进程会从文件中读取输入内容而不是等待控制台输入。
import java.io.File;
import java.io.IOException;
public class InputRedirectDemo {
public static void main(String[] args) throws IOException {
// 假设input.txt文件中有一行内容:hello processbuilder
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "findstr hello");
// 将标准输入重定向到input.txt文件
pb.redirectInput(new File("input.txt"));
// 将标准输出重定向到result.txt
pb.redirectOutput(new File("result.txt"));
Process process = pb.start();
try {
process.waitFor();
System.out.println("输入已重定向,结果输出到result.txt");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
注意事项
- 进程的环境变量修改仅对当前启动的进程生效,不会影响系统全局配置
- 如果手动处理进程的IO流,需要注意读取错误流,避免进程因为输出缓冲区满而阻塞
- 不同操作系统的命令格式不同,比如Windows使用cmd /c,Linux和macOS使用/bin/sh -c,编写跨平台代码时需要做适配
- 使用IO重定向时,如果目标文件不存在,ProcessBuilder会自动创建文件,父目录不存在则会抛出异常
总结
ProcessBuilder相比传统的Runtime.exec方法,在多进程变量控制和IO重定向方面提供了更完善的能力,能够简化复杂进程管理的开发工作。通过合理配置环境变量、工作目录和IO流重定向,可以满足大部分多进程场景下的需求,是Java进程管理场景下的首选工具。
ProcessBuilder多进程变量控制IO重定向Java修改时间:2026-07-04 07:00:27