在 Java 中执行系统命令,主要是使用 ProcessBuilder 和 Runtime.getRuntime().exec()。而在这里主要是介绍两种方法的使用。
Runtime
// 上传之后的视频文件名为test.tmpmedia
String command = "mencoder test.tmpmedia -o test.flv -ofps 25 -of lavf -oac mp3lame -srate 22050 -ovc lavc -lavcopts "
+ "vcodec=flv:keyint=59:vbitrate=6000:mbd=2:trell:v4mv:o=mpv_flagg=cbp_rd:last_pred=3 -vf harddup,scale=480:256";
Process p = Runtime.getRuntime().exec(command);
// 读取命令的输出信息
InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
p.waitFor();
if (p.exitValue() != 0) {
//说明命令执行失败
//可以进入到错误处理步骤中
}
// 打印输出信息
String s = null;
while ((s = reader.readLine()) != null) {
System.out.println(s);
}Copy to clipboardErrorCopied
其中 waitFor()方法会阻塞当前进程,直到命令执行结束。而 exitValue 不会阻塞进程,但是调用 exitValue 的时候,如果命令没有执行完成就会报错。
ProcessBuilder
// 将命令分解为List存储
String[] commandSplit = command.split(" ");
List<String> lcommand = new ArrayList<String>();
for (int i = 0; i < commandSplit.length; i++) {
lcommand.add(commandSplit[i]);
}
ProcessBuilder processBuilder = new ProcessBuilder(lcommand);
processBuilder.redirectErrorStream(true);
Process p = processBuilder.start();
InputStream is = p.getInputStream();
BufferedReader bs = new BufferedReader(new InputStreamReader(is));
p.waitFor();
if (p.exitValue() != 0) {
//说明命令执行失败
//可以进入到错误处理步骤中
}
String line = null;
while ((line = bs.readLine()) != null) {
System.out.println(line);
resultLog += line;
}Copy to clipboardErrorCopied
ProcessBuilder 可以使用 redirectErrorStream 将标准输出和标准错误流合并,然后使用 getInputStream 获取到流,放入 BufferedReader 中打印出来,便可解决缓存区满的问题。