Java ProcessBuilder

ProcessBuilder用来创建一个操作系统进程。

ProcessBuilder部分源码解读
  • 属性信息
public final class ProcessBuilder
{
    private List<String> command;//字符串组成的操作系统命令集
    private File directory;  //默认值是当前进程的当前工作目录
    private Map<String,String> environment;
    private boolean redirectErrorStream;
    private Redirect[] redirects;
    ........
}    
  • 三个重载的command处理函数:对List<String> command属性的处理
public ProcessBuilder command(List<String> command) {
    if (command == null)
        throw new NullPointerException();
    this.command = command;
    return this;
}
public ProcessBuilder command(String... command) {
    this.command = new ArrayList<>(command.length);
    for (String arg : command)
        this.command.add(arg);
    return this;
}

public List<String> command() {
    return command;
}
  • ProcessBuilder中的start()方法开启进程会调用command命令列表和相关参数,这个函数会检测command的正确性以及做系统安全性检查。ProcessBuilder的start()方法最后的返回值如下:
return ProcessImpl.start(cmdarray,
                                     environment,
                                     dir,
                                     redirects,
                                     redirectErrorStream);

它调用了ProcessImpl的start()方法。看一下ProcessImpl,从类名上看他是Process的实现。

  • Process为一个抽象类,start()方法返回值为Process的子类的一个实例,这个实例可以用来控制进程以及获得进程的信息。Process源码如下:
package java.lang;
import java.io.*;

public abstract class Process {

    //返回连接子进程正常输入的输出流
    abstract public OutputStream getOutputStream();

    //返回连接子进程输出的输入流
    abstract public InputStream getInputStream();

    //返回连接子进程异常输出的输入流
    abstract public InputStream getErrorStream();

    //促使当前线程等待,直至只当进程已经结束。子进程结束时函数立即返回
    abstract public int waitFor() throws InterruptedException;

    //返回子进程结束时候的退出值
    abstract public int exitValue();

    //杀死子进程
    abstract public void destroy();
}
ProcessBuilder的使用
  • 示例1:执行java程序(注:.class文件已经生成且在指定路径下)
public static void main(String[] args) throws IOException {
        List<String> commands = new ArrayList<>();
        commands.add("java");
        commands.add("FileTest");

        ProcessBuilder processBuilder = new ProcessBuilder();
        processBuilder.command(commands);
        File file = new File("/Users/lujiafeng/Desktop/SpringBoot-Learning/Java_Test/src");
        processBuilder.directory(file);  //切换到工作目录
        //processBuilder.redirectErrorStream(true);
        Process process = null;
        try {
            process = processBuilder.start();
        } catch (Exception e) {
            e.printStackTrace();
        }

        String result = null;
        String errorresult = null;
        InputStream in = process.getInputStream(); //得到命令执行的流
        BufferedReader br = new BufferedReader(new InputStreamReader(in));

        InputStream error = process.getErrorStream(); //得到命令执行的错误流
        BufferedReader errorbr = new BufferedReader(new InputStreamReader(error));
        String lineStr;
        while ((lineStr = br.readLine()) != null) {
            result = lineStr;
        }

        br.close();
        in.close();
        System.out.println("result: " + result);
        while ((lineStr = errorbr.readLine()) != null) {
            errorresult = lineStr;
        }
        errorbr.close();
        error.close();
        System.out.println("errorresult: " + errorresult);

        try {
            final int status = process.waitFor(); //阻塞,直到上述命令执行完
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            System.out.println("执行结束");
        }
    }
  • 示例2:执行终端命令
public static void main(String[] args) throws IOException {
        ProcessBuilder pb = new ProcessBuilder("ls");
        Process process = pb.start();
        String line;
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK"));
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        reader.close();
    }
  • 示例3:打开.exe程序
ProcessBuilder p = new ProcessBuilder("C:/Program Files/Notepad++/Notepad++.exe");
p.start();
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,766评论 18 399
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,465评论 0 5
  • 故事:今早上联系一个朋友向她询问一个近期一直在联系不上的共同的朋友时,我眼泪止不住出来了。我感受着自己,内心涌动着...
    火种格格阅读 395评论 5 6
  • 作者认为,单纯通过创新而成功的只有少数的天才,大部分人都是通过模仿而成功。模仿并非毫无用处,创新有时基于模仿。企业...
    清寒泠冽阅读 295评论 0 3
  • 文/胥枫 今天的你似乎觉得自己很渺小, 一粒尘埃无法撼动命运的摇摆。或许你会觉得这个世界肮脏的不能入你眼,或许你...
    胥枫阅读 516评论 3 8