一般通過java啟動操作系統(tǒng)進程有兩種方式
1.通過Runtime.getRuntime啟動
Runtime.getRuntime().exec());
exec有三個重載方法鲸郊,分別可以設(shè)置相應(yīng)的命令轨域,系統(tǒng)屬性,和新的進程的工作目錄
2.通過ProcessBuilder啟動
ProcessBuilder是java 1.5后推薦使用的方式腌且,他擁有更多的處理能力姓蜂。如颜启,獲取進程的執(zhí)行信息独郎,包括標(biāo)準(zhǔn)輸出她我、標(biāo)準(zhǔn)錯誤輸出;設(shè)置當(dāng)前工作目錄谷誓;改變環(huán)境參數(shù)等
ProcessBuilder pb = new ProcessBuilder();
List<String> cmds = new ArrayList<String>();
cmds.add("/bin/sh");
cmds.add("/data/soft/java");
cmds.add("test.sh");
pb.command(cmds);
pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
pb.redirectError(ProcessBuilder.Redirect.INHERIT);
pb.redirectInput(ProcessBuilder.Redirect.INHERIT);
pb.directory(new File(getWorkerDir()));
pb.start();
調(diào)用start()方法后可以返回一個Process類绒障,該類擁有結(jié)構(gòu)如下:
public abstract class Process {
//返回連接子進程正常輸入的輸出流
abstract public OutputStream getOutputStream();
//返回連接子進程輸出的輸入流
abstract public InputStream getInputStream();
//返回連接子進程異常輸出的輸入流
abstract public InputStream getErrorStream();
//促使當(dāng)前線程等待,直至只當(dāng)進程已經(jīng)結(jié)束捍歪。子進程結(jié)束時函數(shù)立即返回
abstract public int waitFor() throws InterruptedException;
//返回子進程結(jié)束時候的退出值
abstract public int exitValue();
//殺死子進程
abstract public void destroy();
}