介绍
ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前,都是由Process类处来实现进程的控制管理。
每个 ProcessBuilder 实例管理一个进程属性集。它的start() 方法利用这些属性创建一个新的 Process 实例。
使用ProcessBuilder比使用Process的好处在于,我们不仅仅可以去执行一个应用程序,还可以对执行进程进行更多的管理工作,比如:获取进程的执行信息,包括标准输出、标准错误输出;设置当前工作目录;改变环境参数。
构造方法和函数参见「官方API」!
用法示例
这是一个在Java代码中使用ffmpeg.exe
工具,将多个MP4文件合成为一个的例子,具体代码如下:
/**
* 合并多个Mp4(Avi)文件
* @param ffmpegPath 合并工具路径
* @param txtPath 待合并的文件每行一个保存的txt文件里
* @param outPath 合并后的avi保存路径
*/
public void mergeMp4s(String ffmpegPath,String txtPath,String outPath){
List<String> command = new ArrayList<String>();
command.add(ffmpegPath);
command.add("-f");//合成音视频
command.add("concat");
command.add("-safe");
command.add("0");
command.add("-i");
command.add(txtPath);
command.add("-c");
command.add("copy");
command.add("-y");
command.add(outPath);
try {
ProcessBuilder builder = new ProcessBuilder(command);
builder.command(command);
Process p = builder.start();
if(p.isAlive()){
p.waitFor();
}
} catch (Exception e) {
e.printStackTrace();
}
}
上面代码中,当前的执行线程会被p.waitFor();
阻塞,也就是直到子进程执行完毕代码才会往下进行。
我们可以对子进程的标准输出和标准错误输出进行管理,参见Class Process,如下面的代码:
public static int doWaitFor(Process process) {
int exitValue = -1; // returned to caller when p is finished
InputStream error = process.getErrorStream();
InputStream is = process.getInputStream();
byte[] b = new byte[1024];
int readbytes = -1;
try {
while ((readbytes = error.read(b)) != -1) {
logger.info("标准错误输出信息:" + new String(b, 0, readbytes));
}
while ((readbytes = is.read(b)) != -1) {
logger.info("标准输出信息:" + new String(b, 0, readbytes));
}
} catch (IOException e) {
logger.error("等待进程结束出现错误!");
e.printStackTrace();
} finally {
try {
error.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return exitValue;
}
参考文章: