使用方法
public static void main(String[] args) {
String execute = execute("ffmpeg");
System.out.println(execute);
execute = execute("ping www.baidu.com");
System.out.println(execute);
}
代码
/**
* 调用ProcessBuilder执行,相比Runtime方式,返回值不易丢失
* @param command 命令
* @return 执行结果
*/
public static String execute(String command) {
BufferedReader bufferedReader = null;
StringBuilder stringBuilder = new StringBuilder();
String result = null;
try {
File file = new File("C:\\daemonTmp");
// 新建一个存储结果的缓存文件
File tmpFile = new File("C:\\daemonTmp\\temp.tmp");
if (!file.exists()) {
file.mkdirs();
}
if (!tmpFile.exists()) {
tmpFile.createNewFile();
}
ProcessBuilder processBuilder = new ProcessBuilder()
//TODO 这里如果是linux 需要换成linux的命令 做个判断
.command("cmd.exe", "/c", command).inheritIO();
/**
* 设置环境变量 开始
*/
Map<String, String> environment = processBuilder.environment();
environment.put("ffmpeg","C:\\APP\\media\\ffmpeg\\bin");
String Path = environment.get("Path");
Path +=";C:\\APP\\media\\ffmpeg\\bin";
environment.put("Path", Path);
System.out.println(environment);
/**
* 设置环境变量 结束
*/
/**
* 设置工作目录
*/
processBuilder.directory(new File("C:\\APP\\media"));
// 把控制台中的红字变成了黑字,用通常的方法其实获取不到,控制台的结果是pb.start()方法内部输出的。
processBuilder.redirectErrorStream(true);
// 输出执行结果。
processBuilder.redirectOutput(tmpFile);
// 等待语句执行完成,否则可能会读不到结果。
processBuilder.start().waitFor();
InputStream inputStream = new FileInputStream(tmpFile);
//设置编码
bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "GBK"));
String line = null;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line + "\n");
}
bufferedReader.close();
bufferedReader = null;
result = stringBuilder.toString();
} catch(Exception e) {
e.printStackTrace();
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
return result;
}