目錄
ProcessBuilder類的介紹及使用
【前言】
【正文】
--構(gòu)造方法--
--常用方法--
--使用技巧--
--調(diào)用本地Shell命令,實例--
【總結(jié)】
【注意】
ProcessBuilder類的介紹及使用
【前言】
????????在做一個項目的時候需要用到運行時動態(tài)執(zhí)行JAVA命令,一開始的思路是運行時生成bat腳本,然后通過Runtime類的exec方法之行bat腳本,但是此方法不好的地方在于腳本執(zhí)行時會彈出一個cmd程序界面框。后面在參考YANG的源碼時發(fā)現(xiàn)了另一種運行時執(zhí)行JAVA命令的方法,由此延申,了解了PorcessBuilder類的作用及用法。
????????ProcessBuilder類是J2SE 1.5在java.lang中新添加的一個新類,此類用于創(chuàng)建操作系統(tǒng)進程,它提供一種啟動和管理進程(也就是應(yīng)用程序)的方法。在J2SE 1.5之前,都是由Process類處來實現(xiàn)進程的控制管理。每個 ProcessBuilder 實例管理一個進程屬性集。它的start() 方法利用這些屬性創(chuàng)建一個新的 Process 實例。start() 方法可以從同一實例重復(fù)調(diào)用,以利用相同的或相關(guān)的屬性創(chuàng)建新的子進程。
【正文】
ProcessBuilder類是java.lang包下的基礎(chǔ)類,在使用時無需導(dǎo)入,可以直接使用。它主要用于創(chuàng)建和運行各類外部程序,例如javac,java等等。
--構(gòu)造方法--
它(List<String> command),它(String... command)
--常用方法--
void command(String... command) 用于將待執(zhí)行命令及參數(shù)傳遞給它;
Process start() 執(zhí)行命令并返回一個Process對象,用于獲取對執(zhí)行程序的輸入和輸出;
void directory(File base) 用于設(shè)置待執(zhí)行命令的工作目錄,可以不設(shè)置;
// ProcessBuilder API
//構(gòu)造方法
//利用指定的操作系統(tǒng)程序和參數(shù)構(gòu)造一個進程生成器。
ProcessBuilder(List<String> command)
//利用指定的操作系統(tǒng)程序和參數(shù)構(gòu)造一個進程生成器。
ProcessBuilder(String… command)
//方法
//返回此進程生成器的操作系統(tǒng)程序和參數(shù)。
command()
//設(shè)置此進程生成器的操作系統(tǒng)程序和參數(shù)。
command(List<String> command)
//設(shè)置此進程生成器的操作系統(tǒng)程序和參數(shù)。
command(String… command)
//返回此進程生成器的工作目錄。
directory()
//設(shè)置此進程生成器的工作目錄。
directory(File directory)
//返回此進程生成器環(huán)境的字符串映射視圖。 environment方法獲得運行進程的環(huán)境變量,得到一個Map,可以修改環(huán)境變量
environment()
//返回進程生成器是否合并標(biāo)準(zhǔn)錯誤和標(biāo)準(zhǔn)輸出;true為合并,false為不合并
redirectErrorStream()
//設(shè)置此進程生成器的 redirectErrorStream 屬性。默認值為false不合并
redirectErrorStream(boolean redirectErrorStream)
//使用此進程生成器的屬性啟動一個新進程。
start()
--使用技巧--
1、在使用它的時候建議將其封裝一下,這樣更便于使用,例如,
public class ProcessUtil {
public static void process(String... command) throws Exception {
? ? ? ? process((File)null, command);
? ? }
? ? public static void process(List<String> commandList) throws Exception {
? ? ? ? process((File)null, (String[])commandList.toArray(new String[0]));
? ? }
? ? public static void process(File base, String... command) throws Exception {
? ? ? ? ProcessBuilder processBuilder = new ProcessBuilder(new String[0]);
? ? ? ? if (base != null) {
? ? ? ? ? ? processBuilder.directory(base);
? ? ? ? }
? ? ? ? processBuilder.command(command);
? ? ? ? Process process = processBuilder.start();
......
添加一個input2string()方法,用于將執(zhí)行程序獲得的輸出轉(zhuǎn)換為String對象,便于輸出,例如,
public static String input2str(InputStream inputStream) throws UnsupportedEncodingException {
? ? ? ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
? ? ? ? byte[] buffer = new byte[1024];
? ? ? ? try {
? ? ? ? ? ? int len;
? ? ? ? ? ? while((len = inputStream.read(buffer)) != -1) {
? ? ? ? ? ? ? ? outSteam.write(buffer, 0, len);
? ? ? ? ? ? }
? ? ? ? ? ? outSteam.close();
? ? ? ? ? ? inputStream.close();
? ? ? ? } catch (IOException var5) {
? ? ? ? ? ? var5.printStackTrace();
? ? ? ? }
? ? ? ? return outSteam.toString("utf-8");
? ? }
調(diào)用本地FFMPEG命令,實例:
??
【總結(jié)】
它作為一個JAVA底層類,使開發(fā)者能夠與操作系統(tǒng)進行強大的互動,而且在使用它進行系統(tǒng)命令的調(diào)用時,能夠在后臺進行,不會有使用Runtime類時彈出cmd命令執(zhí)行框的困擾,十分方便。在后面的學(xué)習(xí)當(dāng)中可以進一步了解一下System類的用法。
【注意】
在用Runtime.getRuntime().exec()或ProcessBuilder(array).start()創(chuàng)建子進程Process之后,一定要及時取走子進程的輸出信息和錯誤信息,否則輸出信息流和錯誤信息流很可能因為信息太多導(dǎo)致被填滿,最終導(dǎo)致子進程阻塞住,然后執(zhí)行不下去。
典型用法應(yīng)該為:
參考:Java進程Runtime、Process、ProcessBuilder調(diào)用外部程序_程序猿架構(gòu)的博客-CSDN博客
如果本篇文章對你有幫助的話,很高興能夠幫助上你。文章來源:http://www.zghlxwxcb.cn/news/detail-697232.html
當(dāng)然,如果你覺得文章有什么讓你覺得不合理、或者有更簡單的實現(xiàn)方法又或者有理解不來的地方,希望你在看到之后能夠在評論里指出來,我會在看到之后盡快的回復(fù)你。文章來源地址http://www.zghlxwxcb.cn/news/detail-697232.html
到了這里,關(guān)于Java進程ProcessBuilder類的介紹及使用,ProcessBuilder調(diào)用外部程序執(zhí)行shell命令Linux命令的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!