使用 ProcessBuilder API 优化你的流程

目录

ProcessBuilder 介绍

ProcessBuilder 入门示例

ProcessBuilder 环境变量

ProcessBuilder 工作目录

ProcessBuilder I/O

输出到文件

输出到当前进程

ProcessBuilder 管道操作

ProcessBuilder 超时与终止

ProcessBuilder 异步处理

ProcessBuilder 总结


 

ProcessBuilder 介绍

Java 的 Process API 为开发者提供了执行操作系统命令的强大功能,但是某些 API 方法可能让你有些疑惑,没关系,这篇文章将详细介绍如何使用 ProcessBuilder API 来方便的操作系统命令。

ProcessBuilder 入门示例

我们通过演示如何调用 java -version 命令输出 JDK 版本号,来演示 ProcessBuilder 的入门用法。

package com.wdbyte.os.process;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.commons.io.IOUtils;

/**
 * Process 输出Java 版本号
 * @author https://www.wdbyte.com
 */
public class ProcessBuilderTest1 {

    public static void main(String[] args) throws IOException, InterruptedException {
        // 构建执行命令
        ProcessBuilder processBuilder = new ProcessBuilder("java","-version");
        // 重定向 ERROR 流(有些 JDK 版本 Java 命令通过 ERROR 流输出)
        processBuilder.redirectErrorStream(true);
        // 运行命令 java -version
        Process process = processBuilder.start();
        // 获取PID,这是一个 Java 9 方法
        long pid = process.pid();
        // 一次性获取运行结果
        String result = IOUtils.toString(process.getInputStream());
        // 等到运行结束
        int exitCode = process.waitFor();

        System.out.println("pid:" + pid);
        System.out.println("result:" + result);
        System.out.println("exitCode:" + exitCode);
    }
}

在这段代码中,首先使用 ProcessBuilder 对象包装了要执行的命令 java -version,紧接着重定向 了要执行的进程的 ERROR 输出流(有些 JDK 版本 Java 命令通过 ERROR 流输出)。最后通过 start 方法执行命令,得到一个用于进程管理的 Process 对象,可以获取其 pid 和输出结果。

注意 IOUtils.toString(process.getInputStream());

这里使用了 commons-io 中的工具类把 InputStream 转为字符串。

你可能感兴趣的:(java,开发语言,spring,boot,数据仓库)