原Java執(zhí)行Linux命令
橙生北國閱讀數(shù):132019-07-14
大家知道命令行的強(qiáng)大就是在于linux命令,其可以形成執(zhí)行序列,形成腳本。命令ctrl-\ctrl-n可以離開插入模式而回到正常模式下.換句話這個(gè)命令與相類似,但這個(gè)命令可以在任何模式下使用,就這一點(diǎn)而似乎是要比命令強(qiáng)大一些啊.。這種用法可以替換if exist了 :)3.||usage:第一條命令 || 第二條命令 [|| 第三條命令...]用這種方法可以同時(shí)執(zhí)行多條命令,當(dāng)碰到執(zhí)行正確的命令后將不執(zhí)行后面的命令,如果沒有出現(xiàn)正確的命令則一直執(zhí)行完所有命令。
public static String execShell(String shell) {
StringBuilder result = new StringBuilder();
Process process = null;
BufferedReader bufferedReaderInfo = null;
BufferedReader bufferedReaderError = null;
try {
// 執(zhí)行shell命令,返回了一個(gè)進(jìn)程
process = Runtime.getRuntime().exec(shell);
// 等待命令執(zhí)行完成
process.waitFor();
// 獲取結(jié)果,正常返回是第一個(gè),錯(cuò)誤返回是第二個(gè),返回結(jié)果只能有一個(gè),要么正常執(zhí)行,要么執(zhí)行錯(cuò)誤
bufferedReaderInfo = new BufferedReader(new InputStreamReader(process.getInputStream()));
bufferedReaderError = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line;
// 將返回結(jié)果存到一個(gè)stringbuilder里面,因?yàn)镾tringBuilder是可擴(kuò)展的,所以不用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 類提供了執(zhí)行從進(jìn)程輸入、執(zhí)行輸出到進(jìn)程、等待進(jìn)程完成、檢查進(jìn)程的退出狀態(tài)以及銷毀進(jìn)程的方法。在這里創(chuàng)建了一個(gè)Process類的對(duì)象,然后接收Runtime.exec(”“)的結(jié)果,是因?yàn)镽untime.exec("") 方法創(chuàng)建一個(gè)本機(jī)進(jìn)程,并返回 Process 子類的一個(gè)實(shí)例。
所以這時(shí)候執(zhí)行shell命令的就是這個(gè)Process子類的實(shí)例,然后阻塞linux命令,等待這個(gè)命令執(zhí)行完成。執(zhí)行完成之后獲取這個(gè)進(jìn)程的執(zhí)行結(jié)果。最后把這個(gè)結(jié)果用BufferReader存起來放在StringBuilder里。最后返回出去。