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())返回的流读取将直接到达文件尾。
注意
- 修改进程构建器的属性将影响后续由该对象的 start()) 方法启动的进程,但从不会影响以前启动的进程或 Java 自身的进程。
- 大多数错误检查由 start()) 方法执行。可以修改对象的状态,但这样 start())将会失败。例如,将命令属性设置为一个空列表将不会抛出异常,除非包含了 start())。
- 注意,此类不是同步的 如果多个线程同时访问一个 ProcessBuilder,而其中至少一个线程从结构上修改了其中一个属性,它必须 保持外部同步。
- 要利用一组明确的环境变量启动进程,在添加环境变量之前,首先调用 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的主要内容,如果未能解决你的问题,请参考以下文章
为啥示例不编译,也就是(co-,contra-和in-)方差如何工作?