亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中的ProcessBuilder類詳細解析

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

一、ProcessBuilder基礎(chǔ)

1、ProcessBuilder類

1.1 概述

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)建新的子進程。

1.2 進程屬性

命令 command

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

環(huán)境 environment

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

工作目錄 working directory

默認值是當(dāng)前進程的當(dāng)前工作目錄,通常根據(jù)系統(tǒng)屬性 user.dir 來命名。

redirectErrorStream屬性

此屬性為 false意思是子進程的標(biāo)準(zhǔn)輸出和錯誤輸出被發(fā)送給兩個獨立的流,這些流可以通過 Process.getInputStream() 和 Process.getErrorStream()方法來訪問。如果將值設(shè)置為 true,標(biāo)準(zhǔn)錯誤將與標(biāo)準(zhǔn)輸出合并,在此情況下,合并的數(shù)據(jù)可從 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)建的子進程沒有自己的終端或控制臺。它的所有標(biāo)準(zhǔn) io(即 stdin、stdout 和 stderr)操作都將通過三個流 (getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父進程。父進程使用這些流來提供到子進程的輸入和獲得從子進程的輸出。

2.2 Process抽象類

  • destroy()

殺掉子進程。

  • exitValue()

返回子進程的出口值。

  • InputStream getErrorStream()

獲得子進程的錯誤流。

  • InputStream getInputStream()

獲得子進程的輸入流。

  • OutputStream getOutputStream()

獲得子進程的輸出流。

  • waitFor()

導(dǎo)致當(dāng)前線程等待,如果必要,一直要等到由該 Process 對象表示的進程已經(jīng)終止

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

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

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

3、ProcessBuilder與Runtime.exec()異同

3.1 相同點

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

3.2 不同點

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

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

二、ProcessBuilder實戰(zhàn)

1、API介紹

構(gòu)造方法

  • ProcessBuilder(List command)利用指定的操作系統(tǒng)程序和參數(shù)構(gòu)造一個進程生成器。
  • ProcessBuilder(String… command)利用指定的操作系統(tǒng)程序和參數(shù)構(gòu)造一個進程生成器。

方法

  • command()

返回此進程生成器的操作系統(tǒng)程序和參數(shù)。

  • command(List command)

設(shè)置此進程生成器的操作系統(tǒng)程序和參數(shù)。

  • command(String… command)

設(shè)置此進程生成器的操作系統(tǒng)程序和參數(shù)。

  • directory()

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

  • directory(File directory)

設(shè)置此進程生成器的工作目錄。

  • environment()

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

  • redirectErrorStream()

通知進程生成器是否合并標(biāo)準(zhǔn)錯誤和標(biāo)準(zhǔn)輸出。

  • redirectErrorStream(boolean redirectErrorStream)

設(shè)置此進程生成器的 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");
        //將標(biāo)準(zhǔn)輸入流和錯誤輸入流合并,通過標(biāo)準(zhǔn)輸入流讀取信息
        processBuilder.redirectErrorStream(true);
        try {
            //啟動進程
            Process start = processBuilder.start();
            //獲取輸入流
            InputStream inputStream = start.getInputStream();
            //轉(zhuǎn)成字符輸入流
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "gbk");
            int len = -1;
            char[] c = new char[1024];
            StringBuffer outputString = new StringBuffer();
            //讀取進程輸入流中的內(nèi)容
            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);
        }
    }

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

相關(guān)文章

  • Java8新特性之Collectors.joining()實例詳解

    Java8新特性之Collectors.joining()實例詳解

    在項目中我們常常要對list集合的數(shù)據(jù)做一些字符串拼接/處理等相關(guān)操作,下面這篇文章主要給大家介紹了關(guān)于Java8新特性之Collectors.joining()的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Java字符串比較方法equals的空指針異常的解決

    Java字符串比較方法equals的空指針異常的解決

    這篇文章主要介紹了Java字符串比較方法equals的空指針異常的解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java中字符串替換常用的4種方法

    java中字符串替換常用的4種方法

    在Java中String類提供了許多方便的方法來處理字符串,下面這篇文章主要給大家介紹了關(guān)于java中字符串替換常用的4種方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • mybatis-plus常用注解@TableId和@TableField的用法

    mybatis-plus常用注解@TableId和@TableField的用法

    本文主要介紹了mybatis-plus常用注解@TableId和@TableField的用法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Spring框架基于AOP實現(xiàn)簡單日志管理步驟解析

    Spring框架基于AOP實現(xiàn)簡單日志管理步驟解析

    這篇文章主要介紹了Spring框架基于AOP實現(xiàn)簡單日志管理步驟解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • Springboot搭建JVM監(jiān)控(Springboot + Prometheus + Grafana)

    Springboot搭建JVM監(jiān)控(Springboot + Prometheus +&n

    在應(yīng)用開發(fā)時,監(jiān)控報警必不可少,本文主要介紹了Springboot搭建JVM監(jiān)控(Springboot + Prometheus + Grafana),具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • 分析JVM源碼之Thread.interrupt系統(tǒng)級別線程打斷

    分析JVM源碼之Thread.interrupt系統(tǒng)級別線程打斷

    在java編程中,我們經(jīng)常會調(diào)用Thread.sleep()方法使得線程停止運行一段時間,而Thread類中也提供了interrupt方法供我們?nèi)ブ鲃哟驍嘁粋€線程。那么線程掛起和打斷的本質(zhì)究竟是什么,本文就此問題作一個探究
    2021-06-06
  • SpringCloud集成zookeeper實現(xiàn)服務(wù)注冊并訪問功能

    SpringCloud集成zookeeper實現(xiàn)服務(wù)注冊并訪問功能

    zookeeper和eureka一樣,是用于充當(dāng)服務(wù)注冊功能服務(wù)器的一個springcloud插件,這篇文章主要介紹了SpringCloud集成zookeeper實現(xiàn)服務(wù)注冊并訪問,需要的朋友可以參考下
    2022-06-06
  • SpringBoot中的自動注入方式

    SpringBoot中的自動注入方式

    這篇文章主要介紹了SpringBoot中的自動注入方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Java DriverManager.getConnection()獲取數(shù)據(jù)庫連接

    Java DriverManager.getConnection()獲取數(shù)據(jù)庫連接

    這篇文章主要介紹了Java DriverManager.getConnection()獲取數(shù)據(jù)庫連接,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評論