最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的ProcessBuilder類詳細解析

 更新時間:2024年01月27日 10:36:46   作者:魅Lemon  
這篇文章主要介紹了Java中的ProcessBuilder類詳細解析,ProcessBuilder類是J2SE 1.5在java.lang中新添加的一個新類,此類用于創(chuàng)建操作系統進程,它提供一種啟動和管理進程的方法,需要的朋友可以參考下

一、ProcessBuilder基礎

1、ProcessBuilder類

1.1 概述

ProcessBuilder類是J2SE 1.5在java.lang中新添加的一個新類,此類用于創(chuàng)建操作系統進程,它提供一種啟動和管理進程(也就是應用程序)的方法。在J2SE 1.5之前,都是由Process類處理實現進程的控制管理。

每個ProcessBuilder 實例管理一個進程屬性集,它的start()方法利用這些屬性創(chuàng)建一個新的 Process 實例。start()方法可以從同一實例重復調用,以利用相同的或相關的屬性創(chuàng)建新的子進程。

1.2 進程屬性

命令 command

表示要調用的外部程序文件及其參數(如果有)。

環(huán)境 environment

從變量到值依賴于系統的映射。初始值是當前進程環(huán)境的一個副本(請參閱System.getenv())。

工作目錄 working directory

默認值是當前進程的當前工作目錄,通常根據系統屬性 user.dir 來命名。

redirectErrorStream屬性

此屬性為 false意思是子進程的標準輸出和錯誤輸出被發(fā)送給兩個獨立的流,這些流可以通過 Process.getInputStream() 和 Process.getErrorStream()方法來訪問。如果將值設置為 true,標準錯誤將與標準輸出合并,在此情況下,合并的數據可從 Process.getInputStream() 返回的流讀取,而從 Process.getErrorStream() 返回的流讀取將直接到達文件尾。

ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
Map<String, String> env = pb.environment();
env.put("VAR1", "myValue");
env.remove("OTHERVAR");
env.put("VAR2", env.get("VAR1") + "suffix");
pb.directory("myDir");
Process p = pb.start();

2、Process類

2.1 概述

Process類是一個抽象類(所有的方法均是抽象的),封裝了一個進程(即一個執(zhí)行程序)。

Process 類提供了執(zhí)行從進程輸入、執(zhí)行輸出到進程、等待進程完成、檢查進程的退出狀態(tài)以及銷毀(殺掉)進程的方法。創(chuàng)建的子進程沒有自己的終端或控制臺。它的所有標準 io(即 stdin、stdout 和 stderr)操作都將通過三個流 (getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父進程。父進程使用這些流來提供到子進程的輸入和獲得從子進程的輸出。

2.2 Process抽象類

  • destroy()

殺掉子進程。

  • exitValue()

返回子進程的出口值。

  • InputStream getErrorStream()

獲得子進程的錯誤流。

  • InputStream getInputStream()

獲得子進程的輸入流。

  • OutputStream getOutputStream()

獲得子進程的輸出流。

  • waitFor()

導致當前線程等待,如果必要,一直要等到由該 Process 對象表示的進程已經終止

同時Process對象可以獲得進程句柄,從而可以獲得進程ID、父進程、子進程等信息

2.3 創(chuàng)建Process對象方式

  • 使用命令名和命令的參數選項構造ProcessBuilder對象,它的start方法執(zhí)行命令,啟動一個進程,返回一個Process對象
  • Runtime.exec()方法創(chuàng)建一個本機進程,并返回 Process 子類的一個實例

3、ProcessBuilder與Runtime.exec()異同

3.1 相同點

ProcessBuilder.start() 和 Runtime.exec() 方法都被用來創(chuàng)建一個操作系統進程(執(zhí)行命令行操作),并返回 Process 子類的一個實例,該實例可用來控制進程狀態(tài)并獲得相關信息

3.2 不同點

ProcessBuilder.start() 和 Runtime.exec()傳遞的參數有所不同

Runtime.exec()可接受一個單獨的字符串,這個字符串是通過空格來分隔可執(zhí)行命令程序和參數的;也可以接受字符串數組參數。而ProcessBuilder的構造函數是一個字符串列表或者數組。列表中第一個參數是可執(zhí)行命令程序,其他的是命令行執(zhí)行是需要的參數。

二、ProcessBuilder實戰(zhàn)

1、API介紹

構造方法

  • ProcessBuilder(List command)利用指定的操作系統程序和參數構造一個進程生成器。
  • ProcessBuilder(String… command)利用指定的操作系統程序和參數構造一個進程生成器。

方法

  • command()

返回此進程生成器的操作系統程序和參數。

  • command(List command)

設置此進程生成器的操作系統程序和參數。

  • command(String… command)

設置此進程生成器的操作系統程序和參數。

  • directory()

返回此進程生成器的工作目錄。

  • directory(File directory)

設置此進程生成器的工作目錄。

  • environment()

返回此進程生成器環(huán)境的字符串映射視圖。 environment方法獲得運行進程的環(huán)境變量,得到一個Map,可以修改環(huán)境變量

  • redirectErrorStream()

通知進程生成器是否合并標準錯誤和標準輸出。

  • redirectErrorStream(boolean redirectErrorStream)

設置此進程生成器的 redirectErrorStream 屬性。

  • start()

使用此進程生成器的屬性啟動一個新進程。

2、實戰(zhàn)demo

//Runtime.exec()進行創(chuàng)建
public static void main(String[] args) {
        try {
            Process process = Runtime.getRuntime().exec("ipconfig /all");
            InputStream is = process.getInputStream();
            InputStreamReader isr =new InputStreamReader(is, "gbk");
            BufferedReader br = new BufferedReader(isr);
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
            int exitCode = process.waitFor();
            System.out.println(exitCode);
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
 public static void main(String[] args) {
        ProcessBuilder processBuilder = new ProcessBuilder();
        // System.out.println(processBuilder.directory());
        // System.out.println(processBuilder.environment());
        //processBuilder.command("ping","127.0.0.1");
        processBuilder.command("ipconfig","/all");
        //將標準輸入流和錯誤輸入流合并,通過標準輸入流讀取信息
        processBuilder.redirectErrorStream(true);
        try {
            //啟動進程
            Process start = processBuilder.start();
            //獲取輸入流
            InputStream inputStream = start.getInputStream();
            //轉成字符輸入流
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "gbk");
            int len = -1;
            char[] c = new char[1024];
            StringBuffer outputString = new StringBuffer();
            //讀取進程輸入流中的內容
            while ((len = inputStreamReader.read(c)) != -1) {
                String s = new String(c, 0, len);
                outputString.append(s);
                System.out.print(s);
            }
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
public static void main(String[] args) throws IOException {
        ProcessBuilder processBuilder = new ProcessBuilder("cmd","/c","dir");
        processBuilder.directory(new File("D:/"));
        Process process = processBuilder.start();
        BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK"));
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
    }

到此這篇關于Java中的ProcessBuilder類詳細解析的文章就介紹到這了,更多相關Java的ProcessBuilder類內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

大新县| 汉寿县| 兴隆县| 阳山县| 西昌市| 上饶县| 太仆寺旗| 洪洞县| 容城县| 岐山县| 庆云县| 峨眉山市| 天祝| 山阳县| 体育| 石门县| 冕宁县| 迭部县| 仁化县| 罗定市| 成都市| 铜梁县| 荥阳市| 沂源县| 舞钢市| 泰州市| 谷城县| 南乐县| 石楼县| 大理市| 天祝| 渝中区| 郑州市| 彰化县| 砚山县| 旬阳县| 商河县| 康乐县| 常州市| 安龙县| 伊春市|