API--18--ProcessBuilder

Posted 高高for 循环

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了API--18--ProcessBuilder相关的知识,希望对你有一定的参考价值。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


ProcessBuilder

创建进程两种方式

方式1

Runtime runtime = Runtime.getRuntime();

Process p = runtime.exec(cmd);

方式2

Process p = new ProcessBuilder(cmd).start();

其中:

cmd 是命令行,是一个字符串或者是字符串数组。

  • 不管在哪种操作系统下,程序具有基本类似的一些属性。一个程序启动后就是程序操作系统的一个进程,进程在执行的时候有自己的环境变量、工作目录
  • 能够在Java中执行的外部程序,必须是一个实际存在的可执行文件,对于cmd/shell下的内嵌命令是不能直接执行的,

ProcessBuilder 简介

  • ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前,都是由Process类处来实现进程的控制管理。
  • 每个 ProcessBuilder 实例管理一个进程属性集。它的start() 方法利用这些属性创建一个新的 Process实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。

每个ProcessBuilder 进程生成器管理这些进程 属性:

  • 命令 command
    一个字符串列表,它表示要调用的外部程序文件及其参数(如果有)。在此,表示有效的操作系统命令的字符串列表是依赖于系统的。例如,每一个总体变量,通常都要成为此列表中的元素,但有一些操作系统,希望程序能自己标记命令行字符串——在这种系统中,Java 实现可能需要命令确切地包含这两个元素。
  • 环境 environment
    是从变量 到值 的依赖于系统的映射。初始值是当前进程环境的一个副本(请参阅 System.getenv())。
  • 工作目录 directory
    默认值是当前进程的当前工作目录,通常根据系统属性 user.dir 来命名。
  • redirectErrorStream 属性
    最初,此属性为 false,意思是子进程的标准输出和错误输出被发送给两个独立的流,这些流可以通过 Process.getInputStream()) 和 Process.getErrorStream()) 方法来访问。如果将值设置为 true,标准错误将与标准输出合并。这使得关联错误消息和相应的输出变得更容易。在此情况下,合并的数据可从 Process.getInputStream()) 返回的流读取,而从 Process.getErrorStream())返回的流读取将直接到达文件尾。

注意

  1. 修改进程构建器的属性将影响后续由该对象的 start()) 方法启动的进程,但从不会影响以前启动的进程或 Java 自身的进程。
  2. 大多数错误检查由 start()) 方法执行。可以修改对象的状态,但这样 start())将会失败。例如,将命令属性设置为一个空列表将不会抛出异常,除非包含了 start())。
  3. 注意,此类不是同步的 如果多个线程同时访问一个 ProcessBuilder,而其中至少一个线程从结构上修改了其中一个属性,它必须 保持外部同步。
  4. 要利用一组明确的环境变量启动进程,在添加环境变量之前,首先调用 Map.clear()

ProcessBuilder API

构造方法摘要
ProcessBuilder(List command)利用指定的操作系统程序和参数构造一个进程生成器。
ProcessBuilder(String… command)利用指定的操作系统程序和参数构造一个进程生成器。

//构造方法 
 
//利用指定的操作系统程序和参数构造一个进程生成器。 
ProcessBuilder(List<String> command) 
//利用指定的操作系统程序和参数构造一个进程生成器。
ProcessBuilder(String… command) 
//方法 
 
//返回此进程生成器的操作系统程序和参数。 
command() 
//设置此进程生成器的操作系统程序和参数。 
command(List<String> command) 
//设置此进程生成器的操作系统程序和参数。 
command(String… command) 
 
//返回此进程生成器的工作目录。 
directory() 
//设置此进程生成器的工作目录。
directory(File directory) 
//返回此进程生成器环境的字符串映射视图。 environment方法获得运行进程的环境变量,得到一个Map,可以修改环境变量 
environment() 
//返回进程生成器是否合并标准错误和标准输出;true为合并,false为不合并
redirectErrorStream() 
//设置此进程生成器的 redirectErrorStream 属性。默认值为false不合并
redirectErrorStream(boolean redirectErrorStream) 
//使用此进程生成器的属性启动一个新进程。
start() 

案例应用

案例1

查看ip地址【Windows系统下】


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class test01 

    public static void main(String[] args) 
        ProcessBuilder processBuilder = new ProcessBuilder("ipconfig", "/all");
        try 
            Process process = processBuilder.start();
            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK"));
            String line;
            while ((line = br.readLine()) != null) 
                if (line.indexOf("IPv4") != -1) 
                    System.out.println(line);
                
            
         catch (IOException e) 
            e.printStackTrace();
        

    


案例2

查看"D:"目录, Windows系统下查看目录的命令是dir

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;

public class test02 

    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);
        

    


查看 E:\\英雄联盟 目录


import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class test03 

    public static void main(String[] args) throws IOException 

        try 
            String line = null;
            BufferedReader reader = null;

            List list = new ArrayList();
            //list the files and directorys under C:\\
            list.add("CMD.EXE");
            list.add("/C");
            list.add("dir");
            ProcessBuilder pb = new ProcessBuilder(list);
            pb.directory(new File("E:\\\\英雄联盟"));
            Process p = pb.start();

            reader = new BufferedReader(new InputStreamReader(p.getInputStream(),"GBK"));
            while ((line = reader.readLine()) != null) 
                System.out.println(line);
            
            reader.close();


         catch (Exception e) 
            e.printStackTrace();
        


    


案例3

打印指定字段 echo the value of NAME


import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;


public class test04 

    public static void main(String[] args) throws IOException 
        //echo the value of NAME

        try 
            String line = null;
            BufferedReader reader = null;

            ProcessBuilder pb = new ProcessBuilder();
            pb.command(new String[]"CMD.exe", "/C", "echo %NAME%");
            pb.environment().put("NAME", "TEST-123456789");
            Process p = pb.start();

            reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
            while ((line = reader.readLine()) != null) 
                System.out.println(line);
            
            reader.close();

         catch (Exception e) 
            e.printStackTrace();
        


    


以上是关于API--18--ProcessBuilder的主要内容,如果未能解决你的问题,请参考以下文章

Java堆外内存的使用

输入非假,也就是真

saltStack 配置管理(也就是替换文件)

为啥示例不编译,也就是(co-,contra-和in-)方差如何工作?

为啥示例不编译,也就是(co-、contra-和in-)方差如何工作?

如何通过掩码计算可用的IP数量