[ Java ] 调用本地命令
使用Java调用本地程序
final Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c",
String.format("/Users/liguanglei/Applications/ffmpeg-5.1.2/ffmpeg -allowed_extensions ALL -protocol_whitelist \"file\" -i %s -c copy %s", m3u8, outMp4)
});
Thread outThread = new Thread(() -> {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println("out [" + line + "]");
}
} catch (Exception e) {
}
});
outThread.start();
ArrayList<String> list = new ArrayList<>();
Thread errThread = new Thread(() -> {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String line;
while ((line = br.readLine()) != null) {
// System.out.println("err [" + line + "]");
list.add(line);
}
} catch (Exception e) {
}
});
errThread.start();
outThread.join();
errThread.join();
p.waitFor();
p.exitValue();
执行后Process 的常用方法:
// 导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止。
int waitFor()
/* 如果已终止该子进程,此方法立即返回。
如果没有终止该子进程,调用的线程将被阻塞,直到退出子进程,0 表示正常终止 */
// 杀掉子进程
void destroy()
// 返回子进程的出口值,值 0 表示正常终止
int exitValue()
// 获取子进程的错误流
InputStream getErrorStream()
// 获取子进程的输入流
InputStream getInputStream()
// 获取子进程的输出流
OutputStream getOutputStream()