java 执行外部命令 苹果_Java中执行外部命令
在項目中執(zhí)行一個linux的shell腳本,于是需要在java環(huán)境下執(zhí)行外部命令如系統(tǒng)命令、linux命令的需求,本人小小研究了一下,又上網(wǎng)查了一些資料先整理如下。
java執(zhí)行外部命令主要依賴兩個類Process和Runtime。
一、Process類
ProcessBuilder.start()創(chuàng)建一個本機(jī)進(jìn)程,并返回一個Process子類的一個實例,該實例可以獲取進(jìn)程的相關(guān)信息,也可以控制進(jìn)程。這個進(jìn)程沒有自己的終端,它的操作結(jié)果io都重定向到了它的父進(jìn)程,父進(jìn)程通過getInputStream(),getOutputStream(),getErrorStream()為子進(jìn)程提供輸入和獲取輸出,而對于io流如果有緩沖大小限制,則可能出現(xiàn)阻塞,導(dǎo)致死鎖情況。
可使用destory()方式強(qiáng)制殺掉子進(jìn)程,exitValue()返回執(zhí)行結(jié)果,如果子進(jìn)程需要等待返回,調(diào)用waitFor()方法將當(dāng)前線程等待,直到子進(jìn)程退出。
二、Runtime類
Runtime.getRuntime().exec()?獲得的就是Process類,exec()方法有多個重載可以使用,針對不同的情況設(shè)置不同的參數(shù)。另外需要注意的是執(zhí)行的windows和linux的明林的寫法是不同的。
publicclassruntimeTest?{
public?static?void?main(String[]?args)?{
String?command?=?"notepad.exe?txt.txt";
try?{
Process?process?=?Runtime.getRuntime().exec(command);
BufferedInputStream?bis?=?new?BufferedInputStream(
process.getInputStream());
BufferedReader?br?=?new?BufferedReader(new?InputStreamReader(bis));
String?line;
while?((line?=?br.readLine())?!=?null)?{
System.out.println(line);
}
process.waitFor();
if?(process.exitValue()?!=?0)?{
System.out.println("error!");
}
bis.close();
br.close();
}?catch?(IOException?e)?{
//TODO?Auto-generated?catch?block????????????e.printStackTrace();
}?catch?(InterruptedException?e)?{
//TODO?Auto-generated?catch?block????????????e.printStackTrace();
}
}
}
三、Apache Common-Exec
強(qiáng)烈建議使用apache的第三方庫,該庫提供了更加詳細(xì)的設(shè)置和監(jiān)控方法等等。
執(zhí)行的命令被稱為CommandLine,可使用該類的addArgument()方法為其添加參數(shù),parse()方法將你提供的命令包裝好一個可執(zhí)行的命令。命令是由執(zhí)行器Executor類來執(zhí)行的,DefaultExecutor類的execute()方法執(zhí)行命令,exitValue也可以通過該方法返回接收。設(shè)置ExecuteWatchdog可指定進(jìn)程在出錯后多長時間結(jié)束,這樣有效防止了run-away的進(jìn)程。此外common-exec還支持異步執(zhí)行,Executor通過設(shè)置一個ExecuteResultHandler類,該類的實例會接收住錯誤異常和退出代碼。
CommandLine?cmdLine?=newCommandLine("AcroRd32.exe");
cmdLine.addArgument("/p");
cmdLine.addArgument("/h");
cmdLine.addArgument("${file}");
HashMap?map?=?new?HashMap();
map.put("file",?new?File("invoice.pdf"));
commandLine.setSubstitutionMap(map);
DefaultExecuteResultHandler?resultHandler?=?new?DefaultExecuteResultHandler();
ExecuteWatchdog?watchdog?=?new?ExecuteWatchdog(60*1000);
Executor?executor?=?new?DefaultExecutor();
executor.setExitValue(1);
executor.setWatchdog(watchdog);
executor.execute(cmdLine,?resultHandler);
//some?time?later?the?result?handler?callback?was?invoked?so?we//can?safely?request?the?exit?valueint?exitValue?=?resultHandler.waitFor();
以上是自己從common-exec官方文檔自己的理解,如有錯誤望輕拍!
總結(jié)
以上是生活随笔為你收集整理的java 执行外部命令 苹果_Java中执行外部命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爱奇艺奇遇与京东科技合作 共同推动XR消
- 下一篇: 雪莲果是天山雪莲的果实吗?蚂蚁庄园3.3