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()获取到的输出流为空。