ProcessBuilder的使用(执行多行命令,实时获取日志)

ProcessBuilder用来创建操作系统进程,可以在指定位置,执行指定命令。这里通过process实现java执行shell,python脚本的功能。

1.通过ProcessBuilder执行多行命令

由于需要在命令中设置Path,试了多种方式后,使用cmd/bash封装为一整个命令实现,其中windows环境下使用cmd,linux环境下使用/bin/bash。

windows代码如下:多行命令通过分号分割

List<String> commandList = new ArrayList<>();
commandList .add("cmd");
commandList .add("/c");
commandList .add("your command");
ProcessBuilder pb = new ProcessBuilder(commandList);

linux代码:

List<String> commandList = new ArrayList<>();
commandList .add("/bin/bash");
commandList .add("/c");
commandList .add("your command");
ProcessBuilder pb = new ProcessBuilder(commandList);

多个命令通过在list添加新元素即可,由ProcessBuilder自行拼接最终的命令。至此,可以创建同时执行多行命令的Process。

2.实时获取日志

此处较简单,只是对Process的API的使用,代码如下:

Process process = processBuilder.start();

try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8))){
    //循环等待进程输出,判断进程存活则循环获取输出流数据
    while (process.isAlive()) {
        while (bufferedReader.ready()) {
            String s = bufferedReader.readLine();
            //自定义进程输出处理
            *****
        }
    }
}

//获取执行结果
int status = process.waitFor();

这样就可以实时获取进程日志,在最后获取进程执行结果用以记录。

3.进程输出直接存为文件

ProcessBuilder提供了简单的方法记录进程日志,此处因为还要对信息进行一些处理,所以自定义了处理逻辑。

ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
//统一异常输出和正常输出
pb.redirectErrorStream(true);
//将输出流重定向到日志文件
File log = new File("log");
pb.redirectOutput(Redirect.appendTo(log));

此处需要注意,设置了输出重定向后,process.getInputStream()获取到的输出流为空。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章