背景
前一段时间项目需要在程序里面使用shell命令,就比较纠结,问我导师,导师给我说你可以去百度一下,Java是可以执行shell命令的。听到这个消息我就有点懵了,Java还可以执行Shell命令,有点强大啊!后来在网上搜了一些博文,看了看,还真的是可以的。
代码
public static String execShell(String shell) {
StringBuilder result = new StringBuilder();
Process process = null;
BufferedReader bufferedReaderInfo = null;
BufferedReader bufferedReaderError = null;
try {
// 执行shell命令,返回了一个进程
process = Runtime.getRuntime().exec(shell);
// 等待命令执行完成
process.waitFor();
// 获取结果,正常返回是第一个,错误返回是第二个,返回结果只能有一个,要么正常执行,要么执行错误
bufferedReaderInfo = new BufferedReader(new InputStreamReader(process.getInputStream()));
bufferedReaderError = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line;
// 将返回结果存到一个stringbuilder里面,因为StringBuilder是可扩展的,所以不用String
while (bufferedReaderInfo.readLine() != null || bufferedReaderError.readLine() != null) {
if (bufferedReaderInfo.readLine() != null) {
line = bufferedReaderInfo.readLine();
} else {
line = bufferedReaderError.readLine();
}
result.append(line + "\n");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
// 释放资源
if (bufferedReaderError!=null){
try {
bufferedReaderError.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedReaderInfo!=null){
try {
bufferedReaderInfo.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (process!=null){
process.destroy();
}
}
return result.toString();
}
原理
Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁进程的方法。在这里创建了一个Process类的对象,然后接收Runtime.exec(”“)的结果,是因为Runtime.exec("") 方法创建一个本机进程,并返回 Process 子类的一个实例。
所以这时候执行shell命令的就是这个Process子类的实例,然后阻塞,等待这个命令执行完成。执行完成之后获取这个进程的执行结果。最后把这个结果用BufferReader存起来放在StringBuilder里。最后返回出去。