Java-API简析_java.lang.Process类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://blog.csdn.net/m0_69908381/article/details/131714752
出自【进步*于辰的博客

1、概述

继承关系:

  • java.lang.Object
    • java.lang.Process

·public abstract class Process extends Object

ProcessBuilder.start()Runtime.exec() 方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获取相关信息。Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。

创建进程的方法可能无法针对某些本机平台上的特定进程很好地工作,比如,本机窗口进程,守护进程,Microsoft Windows 上的 Win16/DOS 进程,或者 shell 脚本创建的子进程没有自己的终端或控制台。它的所有标准 io(即 stdin,stdout,stderr)操作都将通过三个流 (getOutputStream(),getInputStream(),getErrorStream()) 重定向到父进程。父进程使用这些流来提供到子进程的输入和获得从子进程的输出。因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小,如果读写子进程的输出流或输入流迅速出现失败,则可能导致子进程阻塞,甚至产生死锁。

当没有 Process 对象的更多引用时,不是删掉子进程,而是继续异步执行子进程。

对于带有 Process 对象的 Java 进程,没有必要异步或并发执行由 Process 对象表示的进程。

从以下版本开始:
JDK1.0
另请参见:
ProcessBuilderRuntime.exec(String[], String[], File)

2、方法摘要

2.1 abstract void destroy()

杀掉子进程。
说明:此Process对象表示的子进程是否被强制终止取决于实现。

2.2 abstract int exitValue()

返回子进程的出口值。(0表示正常终止)
说明:
如果这个Process对象表示的子进程还没有终止,抛出 IllegalThreadStateException。

2.3 abstract InputStream getErrorStream()

获得子进程的错误流。
说明:
返回连接到子进程的错误输出的输入流。流通过管道从process对象表示的进程的错误输出中获取数据。

如果子进程的标准错误已使用ProcessBuilder.redirectError()ProcessBuilder.redirectErrorStream()进行重定向。那么这个方法将返回一个空输入流

2.4 abstract InputStream getInputStream()

获得子进程的输入流。
说明:
返回连接到子进程的正常输出的输入流。流通过管道从这个process对象表示的进程的标准输出中获取数据。

如果子进程的标准输出已使用ProcessBuilder.redirectOutput()进行重定向,则此方法将返回一个空输入流

否则,如果子进程的标准错误已使用ProcessBuilder.redirectErrorStream()进行重定向,则此方法返回的输入流将接收合并的标准输出和子进程的标准错误。

2.5 abstract OutputStream getOutputStream()

获得子进程的输出流。
说明:
返回连接到子进程的正常输入的输出流。流的输出通过管道连接到由此process对象表示的进程的标准输入。

如果子进程的标准输入已使用 ProcessBuilder.redirectInput()进行重定向,则此方法将返回空输出流

2.6 abstract int waitFor()

导致当前线程等待,如果必要,一直要等到由该 Process 对象表示的进程已经终止。
说明:
如果需要,使当前线程等待,直到由此process对象表示的进程终止。如果子进程已经终止,此方法将立即返回。如果子进程尚未终止,则调用线程将被阻塞,直到子进程退出。

返回此Process对象表示的子进程的退出值,0表示正常终止

如果当前线程在等待时被另一个线程中断,则等待结束并抛出 InterruptedException。

2.7 示例

public static Map<String, Object> exec(String command, String dirPath, String param) throws Exception {
    Map<String, Object> resultMap = new TreeMap<>();

    Runtime runtime = Runtime.getRuntime();
    Process process;
    if (dirPath == null)
        process = runtime.exec(command);
    else
        process = runtime.exec(command, null, new File(dirPath));

    // 提供命令所需参数(暂未测试出实际作用)
    OutputStreamWriter out = new OutputStreamWriter(process.getOutputStream(), "gbk");
    if (!(param == null || param.isEmpty())) {
        out.write(param);
    }
    resultMap.put("out", param);
    out.close();

    StringBuilder result = new StringBuilder(1024);
    String tempStr;

    BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(), "gbk"));
    while ((tempStr = in.readLine()) != null) {
        result.append(tempStr);
        result.append("\n");
    }
    resultMap.put("in", result.toString());
    in.close();

    result = new StringBuilder();
    tempStr = "";

    BufferedReader err = new BufferedReader(new InputStreamReader(process.getErrorStream(), "gbk"));
    while ((tempStr = err.readLine()) != null) {
        result.append(tempStr);
        result.append("\n");
    }
    resultMap.put("err", result.toString());
    err.close();

    return resultMap;
}

关于exec(),见Runtime类的第2.3项。

注: 此类其实是进程,读取输入流、错误流其实就是获取执行命令(如:cmd命令)后的打印结果,而输出流暂不知如何使用。

最后

如果大家需要Java-API文档,我上传了《Java-API文档-包含5/8/11三个版本》。


本文暂缓更新。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进步·于辰

感谢打赏!很高兴可以帮到你!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值