|
|
@@ -1,28 +1,42 @@
|
|
|
package space.anyi.process;
|
|
|
|
|
|
-import org.slf4j.Logger;
|
|
|
-import org.slf4j.LoggerFactory;
|
|
|
-
|
|
|
import java.io.BufferedReader;
|
|
|
+import java.io.File;
|
|
|
import java.io.IOException;
|
|
|
import java.io.InputStreamReader;
|
|
|
-import java.util.List;
|
|
|
+import java.nio.charset.StandardCharsets;
|
|
|
+import java.nio.file.Paths;
|
|
|
+
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
|
|
|
+/**
|
|
|
+ * 示例一:通过 ProcessBuilder 构建并启动子进程。
|
|
|
+ *
|
|
|
+ * 用 ProcessBuilder 指定要运行的命令,调用 start() 启动子进程;
|
|
|
+ * 子进程为 src/main/resources/code/hello/Main.java(向标准输出打印两行后正常退出)。
|
|
|
+ */
|
|
|
public class QuickStart {
|
|
|
- private final static Logger log = LoggerFactory.getLogger(QuickStart.class);
|
|
|
+ private static final Logger log = LoggerFactory.getLogger(QuickStart.class);
|
|
|
+
|
|
|
public static void main(String[] args) throws IOException, InterruptedException {
|
|
|
- //1.ProcessBuilder构建Process
|
|
|
- List<String> cmd = List.of("java", "--version");
|
|
|
- Process process = new ProcessBuilder(cmd)
|
|
|
- //启动Process
|
|
|
+ // 子进程程序所在目录(相对当前工程根目录),先编译再运行
|
|
|
+ File workDir = Paths.get(System.getProperty("user.dir"), "src", "main", "resources", "code", "hello").toFile();
|
|
|
+ Jdk.compileFixture(workDir);
|
|
|
+
|
|
|
+ // 1. 通过 ProcessBuilder 构建命令并启动子进程:
|
|
|
+ // 命令要素 = 可执行文件绝对路径 + Main 类名;directory() 指定子进程的工作目录
|
|
|
+ Process process = new ProcessBuilder(Jdk.java(), "-Dfile.encoding=UTF-8", "Main")
|
|
|
+ .directory(workDir)
|
|
|
.start();
|
|
|
- //2.获取Process标准输出到程序中
|
|
|
- new BufferedReader(new InputStreamReader(process.getInputStream()))
|
|
|
+
|
|
|
+ // 2. 读取子进程的标准输出(println 输出的内容)
|
|
|
+ new BufferedReader(new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8))
|
|
|
.lines()
|
|
|
- .forEach((line)->{log.info("标准输出:{}",line);});
|
|
|
- //3.获取Process执行结果的状态码,0:表示正常退出;1:表示异常退出
|
|
|
+ .forEach(line -> log.info("子进程标准输出: {}", line));
|
|
|
+
|
|
|
+ // 3. 等待子进程结束,返回退出状态码,0 表示正常退出
|
|
|
int exitStatus = process.waitFor();
|
|
|
-// int exitValue = process.exitValue();
|
|
|
- log.info("退出状态码:{}",exitStatus);
|
|
|
+ log.info("子进程退出状态码: {}", exitStatus);
|
|
|
}
|
|
|
-}
|
|
|
+}
|