Process类
通过Process可以在java进程类运行其他进程。
1.核心类
Java.lang.Process
Java.lang.ProcessBuilder
Java.lang.Runtime
2.核心方法
2.运行过程
如果Java进程后续的执行依赖于子进程的执行结果,则等待子进程执行结束,否则可以并发执行
3.案例
-
通过Runtime执行命令
可以使用 Runtime.getRuntime().exec(String command) 方法启动一个新的进程。这个方法将指定的命令作为字符串参数,并返回一个 Process 对象,该对象代表了新进程的执行。
-
通过runProcess.waitFor();等待执行完毕
使用 waitFor() 方法可以让当前线程等待与 Process 对象相关联的进程执行完成。这可以用于确保在继续执行后续代码之前等待进程完成。 此方法会返回一个int值(错误码),如果为0则表示程序正常运行
-
与进程进行交互
-
一旦你有了一个 Process 对象,你可以使用它来与进程进行交互。你可以获取进程的输入流(标准输入)、输出流(标准输出)和错误流(标准错误),从中读取或写入数据。这样可以与进程进行双向通信
-
你可以使用 getInputStream()、getOutputStream() 和 getErrorStream() 方法分别获取这些流。
-
通过runProcess.getInputStream()获取正常输出结果
-
通过runProcess.getErrorStream()获取非正常输出结果
注意:如果我们要获取控制台的输入要调用的是输出流而不是输入流
-
4, 销毁进程
使用 destroy() 方法可以强制终止与 Process 对象相关联的进程。这应该谨慎使用,因为它可能导致进程异常终止,可能会导致数据丢失或不一致性。
String compileCmd = String.format("javac -encoding utf-8 %s", userCodeFile.getAbsolutePath());
Process compileProcess = Runtime.getRuntime().exec(compileCmd);
// 等待程序执行,获取错误码
int exitValue = runProcess.waitFor();
// 正常退出
if (exitValue == 0) {
System.out.println(opName + "成功");
// 分批获取进程的正常输出
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(runProcess.getInputStream()));
List<String> outputStrList = new ArrayList<>();
// 逐行读取
String compileOutputLine;
while ((compileOutputLine = bufferedReader.readLine()) != null) {
outputStrList.add(compileOutputLine);
}
executeMessage.setMessage(StringUtils.join(outputStrList, "\n"));
} else {
// 异常退出
System.out.println(opName + "失败,错误码: " + exitValue);
// 分批获取进程的正常输出
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(runProcess.getInputStream()));
List<String> outputStrList = new ArrayList<>();
// 逐行读取
String compileOutputLine;
while ((compileOutputLine = bufferedReader.readLine()) != null) {
outputStrList.add(compileOutputLine);
}
executeMessage.setMessage(StringUtils.join(outputStrList, "\n"));
// 分批获取进程的错误输出
BufferedReader errorBufferedReader = new BufferedReader(new InputStreamReader(runProcess.getErrorStream()));
// 逐行读取
List<String> errorOutputStrList = new ArrayList<>();
// 逐行读取
String errorCompileOutputLine;
while ((errorCompileOutputLine = errorBufferedReader.readLine()) != null) {
errorOutputStrList.add(errorCompileOutputLine);
}
executeMessage.setErrorMessage(StringUtils.join(errorOutputStrList, "\n"));
}