|
@@ -2,6 +2,7 @@
|
|
|
|
|
|
|
|
本教程通过 3 个可运行的示例,讲解 `ProcessBuilder` / `Process` 的核心用法。所有示例都以
|
|
本教程通过 3 个可运行的示例,讲解 `ProcessBuilder` / `Process` 的核心用法。所有示例都以
|
|
|
`src/main/resources/code/` 下的 `.java` 程序作为子进程,先编译再运行。
|
|
`src/main/resources/code/` 下的 `.java` 程序作为子进程,先编译再运行。
|
|
|
|
|
+每个**案例点**由独立的 `static` method 演示,在 `main()` 中依次调用。
|
|
|
|
|
|
|
|
## 运行示例
|
|
## 运行示例
|
|
|
|
|
|
|
@@ -17,7 +18,7 @@ java -cp "target/classes:$(mvn -q dependency:build-classpath -Dmdep.outputFile=/
|
|
|
|
|
|
|
|
## 一、通过 ProcessBuilder 构建 Process —— `QuickStart`
|
|
## 一、通过 ProcessBuilder 构建 Process —— `QuickStart`
|
|
|
|
|
|
|
|
-入门示例:`space.anyi.process.QuickStart`
|
|
|
|
|
|
|
+案例点:`buildProcess()`(示例类:`space.anyi.process.QuickStart`)
|
|
|
|
|
|
|
|
```java
|
|
```java
|
|
|
// 1. 构建命令并启动子进程:可执行文件绝对路径 + Main 类名,directory() 指定工作目录
|
|
// 1. 构建命令并启动子进程:可执行文件绝对路径 + Main 类名,directory() 指定工作目录
|
|
@@ -43,9 +44,13 @@ int exitStatus = process.waitFor();
|
|
|
|
|
|
|
|
## 二、获取 Process 的输入和输出 —— `ProcessIOExample`
|
|
## 二、获取 Process 的输入和输出 —— `ProcessIOExample`
|
|
|
|
|
|
|
|
-示例:`space.anyi.process.ProcessIOExample`
|
|
|
|
|
|
|
+案例点:`standardOutput()` / `standardError()` / `standardInput()`(示例类:`space.anyi.process.ProcessIOExample`)
|
|
|
|
|
|
|
|
-子进程(`code/io/Main.java`)从标准输入逐行读取、回显到标准输出,读到 EOF 后向标准错误打印统计信息。主进程演示:
|
|
|
|
|
|
|
+子进程(`code/io/Main.java`)启动时打印一行 stdout,从标准输入逐行读取并回显,读到 EOF 后向标准错误打印统计信息。三个案例点:
|
|
|
|
|
+
|
|
|
|
|
+- `standardOutput()`:启动子进程、后台读 `getInputStream()`,看到启动横幅即标准输出 ✓
|
|
|
|
|
+- `standardError()`:关闭 stdin 后读 `getErrorStream()`,看到 EOF 统计行即错误输出 ✓
|
|
|
|
|
+- `standardInput()`:向 `getOutputStream()` 写两行,子进程回显到 stdout ✓
|
|
|
|
|
|
|
|
```java
|
|
```java
|
|
|
// 标准输出、标准错误分别在后台线程读取,避免阻塞主线程、也避免管道写满导致子进程卡死
|
|
// 标准输出、标准错误分别在后台线程读取,避免阻塞主线程、也避免管道写满导致子进程卡死
|
|
@@ -79,9 +84,9 @@ try (OutputStream stdin = process.getOutputStream()) {
|
|
|
|
|
|
|
|
## 三、获取 Process 执行的状态码 —— `ExecuteStatusExample`
|
|
## 三、获取 Process 执行的状态码 —— `ExecuteStatusExample`
|
|
|
|
|
|
|
|
-示例:`space.anyi.process.ExecuteStatusExample`
|
|
|
|
|
|
|
+案例点:`blockingWaitFor()` / `timedWaitFor()`(示例类:`space.anyi.process.ExecuteStatusExample`)
|
|
|
|
|
|
|
|
-子进程(`code/executeStatus/Main.java`)睡眠 10 秒后退出,用于对比两种获取退出码的方式:
|
|
|
|
|
|
|
+子进程(`code/executeStatus/Main.java`)睡眠 10 秒后退出,用来对比两种获取退出码的方式:
|
|
|
|
|
|
|
|
```java
|
|
```java
|
|
|
// 方式一:阻塞式,一直等到子进程结束,返回退出码(0 正常,非 0 异常)
|
|
// 方式一:阻塞式,一直等到子进程结束,返回退出码(0 正常,非 0 异常)
|