如何使用java.lang.ProcessBuilder启动新进程?

林欢喜 Java经验 发布时间:2025-11-28 06:38:21 阅读数:18835 1
下文笔者讲述使用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. 等待进程完成并获取退出码。
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202511/17642831338519.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者