原Java执行Linux命令
橙生北国阅读数:132019-07-14
大家知道命令行的强大就是在于linux命令,其可以形成执行序列,形成脚本。命令ctrl-\ctrl-n可以离开插入模式而回到正常模式下.换句话这个命令与相类似,但这个命令可以在任何模式下使用,就这一点而似乎是要比命令强大一些啊.。这种用法可以替换if exist了 :)3.||usage:第一条命令 || 第二条命令 [|| 第三条命令...]用这种方法可以同时执行多条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令。
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子类的实例,然后阻塞linux命令,等待这个命令执行完成。执行完成之后获取这个进程的执行结果。最后把这个结果用BufferReader存起来放在StringBuilder里。最后返回出去。
上一个教程:如何从Java调用Linuxshell命令