目前java提供两种方式调用Windows下的其他exe程序, Runtime和ProcessBulider。原理相同,同时通过执行类似cmd命令的方式启动和关闭程序。两种方法都会返回一个用于管理操作系统进程的Process对象,最终生成的Process子进程独立于Jvm之外,就算没有对象应用指向它,也不会被GC关闭或者释放。
创建子进程Process后,要及时取走子进程输出信息和错误信息,否则很可能因为信息太多导致子进程阻塞。
这里我就以ProcessBulider为例,介绍一下Springboot代码中如何实现其功能。
ProcessBuilder是java 5.0引入的,start()方法返回Process的一个实例。创建Controller层代码,只要实现两个方法,开启程序的startEXE()方法和关闭程序的closetEXE()方法:
@RestController
@Slf4j
@RequestMapping("/test")
public class ProcessController {
@RequestMapping("/start")
//通过cmd命令开启exe程序
public String startEXE() throws IOException {
log.info("Line[" + Thread.currentThread().getStackTrace()[1].getLineNumber() + "] :start cuteftppro.exe");
ProcessBuilder process=createProcessBuilder("cuteftppro.exe","D:\\yaken\\Program Files\\CuteFTP9",null);
try {
Process proc = process.start();
//执行程序
// BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream(), "gbk"));
// SequenceInputStream是一个串联流,能够把两个流结合起来,可以将getInputStream和getErrorStream获取到的流一起查看
BufferedReader br = new BufferedReader(new InputStreamReader(new SequenceInputStream(proc.getInputStream(), proc.getErrorStream()), "gbk"));
CmdGetter cg = new CmdGetter(br, proc);