Skip to content

Commit 84bf5cb

Browse files
committed
feat: - [ProcessBuilder API 使用教程](https://www.wdbyte.com/java/os/processbuilder/)
1 parent 9717e5a commit 84bf5cb

14 files changed

Lines changed: 450 additions & 0 deletions
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
target/
2+
!.mvn/wrapper/maven-wrapper.jar
3+
!**/src/main/**/target/
4+
!**/src/test/**/target/
5+
6+
### IntelliJ IDEA ###
7+
.idea/modules.xml
8+
.idea/jarRepositories.xml
9+
.idea/compiler.xml
10+
.idea/libraries/
11+
*.iws
12+
*.iml
13+
*.ipr
14+
15+
### Eclipse ###
16+
.apt_generated
17+
.classpath
18+
.factorypath
19+
.project
20+
.settings
21+
.springBeans
22+
.sts4-cache
23+
24+
### NetBeans ###
25+
/nbproject/private/
26+
/nbbuild/
27+
/dist/
28+
/nbdist/
29+
/.nb-gradle/
30+
build/
31+
!**/src/main/**/build/
32+
!**/src/test/**/build/
33+
34+
### VS Code ###
35+
.vscode/
36+
37+
### Mac OS ###
38+
.DS_Store
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
## core-java-os
2+
当前模块包含操作系统操作相关代码
3+
4+
### 相关文章
5+
6+
- [ProcessBuilder API 使用教程](https://www.wdbyte.com/java/os/processbuilder/)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
<parent>
7+
<groupId>com.wdbyte.core-java-modules</groupId>
8+
<artifactId>core-java-modules</artifactId>
9+
<version>1.0.0-SNAPSHOT</version>
10+
</parent>
11+
12+
<artifactId>core-java-os</artifactId>
13+
14+
<properties>
15+
<maven.compiler.source>17</maven.compiler.source>
16+
<maven.compiler.target>17</maven.compiler.target>
17+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
18+
</properties>
19+
<dependencies>
20+
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
21+
<dependency>
22+
<groupId>commons-io</groupId>
23+
<artifactId>commons-io</artifactId>
24+
<version>2.12.0</version>
25+
</dependency>
26+
</dependencies>
27+
28+
</project>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.wdbyte.os.process;
2+
3+
import java.io.IOException;
4+
5+
/**
6+
* @author https://www.wdbyte.com
7+
*/
8+
public class ExecDemo {
9+
10+
public static void main(String[] args) throws InterruptedException {
11+
System.out.println("开始处理数据...");
12+
for (int i = 0; i < 10; i++) {
13+
Thread.sleep(1000);
14+
System.out.println(i);
15+
}
16+
System.out.println("数据处理完毕");
17+
}
18+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.wdbyte.os.process;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStream;
6+
import java.io.InputStreamReader;
7+
8+
import org.apache.commons.io.IOUtils;
9+
10+
/**
11+
* Process 输出Java 版本号
12+
* @author https://www.wdbyte.com
13+
*/
14+
public class ProcessBuilderTest1 {
15+
16+
public static void main(String[] args) throws IOException, InterruptedException {
17+
// 构建执行命令
18+
ProcessBuilder processBuilder = new ProcessBuilder("java","-version");
19+
// 重定向 ERROR 流(有些 JDK 版本 Java 命令通过 ERROR 流输出)
20+
processBuilder.redirectErrorStream(true);
21+
// 运行命令 java -version
22+
Process process = processBuilder.start();
23+
// 过去PID
24+
long pid = process.pid();
25+
// 一次性获取运行结果
26+
//String result = convertInputStreamToString(process.getInputStream());
27+
String result = IOUtils.toString(process.getInputStream());
28+
// 等到运行结束
29+
int exitCode = process.waitFor();
30+
31+
System.out.println("pid:" + pid);
32+
System.out.println("result:" + result);
33+
System.out.println("exitCode:" + exitCode);
34+
}
35+
36+
public static String convertInputStreamToString(InputStream inputStream) throws IOException {
37+
StringBuilder sb = new StringBuilder();
38+
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {
39+
String line = null;
40+
while ((line = bufferedReader.readLine()) != null) {
41+
sb.append(line);
42+
sb.append(System.lineSeparator());
43+
}
44+
} catch (IOException e) {
45+
throw new RuntimeException(e);
46+
} finally {
47+
inputStream.close();
48+
}
49+
return sb.toString();
50+
}
51+
52+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.wdbyte.os.process;
2+
3+
import java.io.File;
4+
import java.io.IOException;
5+
import java.util.concurrent.CompletableFuture;
6+
7+
/**
8+
* @author https://www.wdbyte.com
9+
*/
10+
public class ProcessBuilderTest10 {
11+
private static String BASE_DIR = "/Users/darcy/git/JavaNotes/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process";
12+
13+
public static void main(String[] args) throws InterruptedException {
14+
ProcessBuilder processBuilder = new ProcessBuilder();
15+
processBuilder.directory(new File(BASE_DIR));
16+
processBuilder.command("java", "ExecDemo.java");
17+
// 把子线程 I/O 输出重定向当前进程
18+
processBuilder.inheritIO();
19+
20+
// 创建 CompletableFuture 对象
21+
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
22+
try {
23+
// 命令执行
24+
Process process = processBuilder.start();
25+
// 任务超时时间
26+
process.waitFor();
27+
} catch (IOException e) {
28+
throw new RuntimeException(e);
29+
} catch (InterruptedException e) {
30+
throw new RuntimeException(e);
31+
}
32+
return null;
33+
});
34+
35+
// 注册回调函数,处理异步等待的结果
36+
future.thenAccept(result -> {
37+
System.out.println("进程执行结束");
38+
});
39+
System.out.println("主进程等待");
40+
Thread.sleep(20 * 1000);
41+
}
42+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.wdbyte.os.process;
2+
3+
import java.io.IOException;
4+
import java.util.Map;
5+
6+
import org.apache.commons.io.IOUtils;
7+
8+
/**
9+
* 修改环境变量
10+
*
11+
* @author https://www.wdbyte.com
12+
*/
13+
public class ProcessBuilderTest2 {
14+
15+
public static void main(String[] args) throws IOException, InterruptedException {
16+
ProcessBuilder processBuilder = new ProcessBuilder();
17+
Map<String, String> environment = processBuilder.environment();
18+
environment.forEach((k, v) -> System.out.println(k + ":" + v));
19+
System.out.println("--------------");
20+
processBuilder.environment().put("my_website", "www.wdbyte.com");
21+
processBuilder.command("/bin/bash", "-c", "echo $my_website");
22+
23+
Process process = processBuilder.start();
24+
long pid = process.pid();
25+
String result = IOUtils.toString(process.getInputStream());
26+
int exitCode = process.waitFor();
27+
28+
System.out.println("pid:" + pid);
29+
System.out.println("result:" + result);
30+
System.out.println("exitCode:" + exitCode);
31+
}
32+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.wdbyte.os.process;
2+
3+
import java.io.File;
4+
import java.io.IOException;
5+
6+
import org.apache.commons.io.IOUtils;
7+
8+
/**
9+
* 修改工作目录
10+
* @author https://www.wdbyte.com
11+
*/
12+
public class ProcessBuilderTest3 {
13+
14+
private static String BASE_DIR = "/Users/darcy/git/JavaNotes/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process";
15+
16+
public static void main(String[] args) throws IOException, InterruptedException {
17+
ProcessBuilder processBuilder = new ProcessBuilder();
18+
processBuilder.directory(new File(BASE_DIR));
19+
processBuilder.command("/bin/bash", "-c", "pwd");
20+
Process process = processBuilder.start();
21+
22+
long pid = process.pid();
23+
String result = IOUtils.toString(process.getInputStream());
24+
int exitCode = process.waitFor();
25+
26+
System.out.println("pid:" + pid);
27+
System.out.println("result:" + result);
28+
System.out.println("exitCode:" + exitCode);
29+
}
30+
31+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.wdbyte.os.process;
2+
3+
import java.io.File;
4+
import java.io.IOException;
5+
import java.nio.file.Files;
6+
7+
/**
8+
* 输出日志到指定文件
9+
* @author https://www.wdbyte.com
10+
*/
11+
public class ProcessBuilderTest4 {
12+
private static String BASE_DIR = "/Users/darcy/git/JavaNotes/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process";
13+
14+
public static void main(String[] args) throws IOException, InterruptedException {
15+
ProcessBuilder processBuilder = new ProcessBuilder();
16+
processBuilder.directory(new File(BASE_DIR));
17+
processBuilder.command("/bin/bash", "-c", "ls -l");
18+
19+
File logFile = new File(BASE_DIR + "/process_log.txt");
20+
// 输出到日志文件
21+
processBuilder.redirectOutput(logFile);
22+
// 追加日志到文件
23+
// processBuilder.redirectOutput(ProcessBuilder.Redirect.appendTo(logFile));
24+
// 是否输出ERROR日志到文件
25+
processBuilder.redirectErrorStream(true);
26+
27+
Process process = processBuilder.start();
28+
long pid = process.pid();
29+
int exitCode = process.waitFor();
30+
System.out.println("pid:" + pid);
31+
System.out.println("exitCode:" + exitCode);
32+
33+
// 读取日志
34+
Files.lines(logFile.toPath()).forEach(System.out::println);
35+
}
36+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.wdbyte.os.process;
2+
3+
import java.io.File;
4+
import java.io.IOException;
5+
import java.nio.file.Files;
6+
7+
/**
8+
* 输出日志到指定文件
9+
*
10+
* @author https://www.wdbyte.com
11+
**
12+
*/
13+
public class ProcessBuilderTest5 {
14+
private static String BASE_DIR = "/Users/darcy/git/JavaNotes/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process";
15+
16+
public static void main(String[] args) throws IOException, InterruptedException {
17+
18+
ProcessBuilder processBuilder = new ProcessBuilder();
19+
processBuilder.directory(new File(BASE_DIR));
20+
// 执行命令 xxx,命令不存在,会报 ERROR 日志
21+
processBuilder.command("/bin/bash", "-c", "xxx");
22+
23+
File infoLogFile = new File(BASE_DIR + "/process_log_info.txt");
24+
File errorLogFile = new File(BASE_DIR + "/process_log_error.txt");
25+
// 日志输出到文件
26+
processBuilder.redirectOutput(infoLogFile);
27+
processBuilder.redirectError(errorLogFile);
28+
Process process = processBuilder.start();
29+
30+
long pid = process.pid();
31+
int exitCode = process.waitFor();
32+
33+
System.out.println("pid:" + pid);
34+
System.out.println("exitCode:" + exitCode);
35+
36+
// 读取 ERROR 日志
37+
Files.lines(errorLogFile.toPath()).forEach(System.out::println);
38+
}
39+
40+
}

0 commit comments

Comments
 (0)