目录
・Process.redirectErrorStream(true)方法:
■Java Process.exitValue & Process.waitFor()
=================
■Runtime、ProcessBuilder 区别:
ProcessBuilder.start() 和 Runtime.exec()传递的参数有所不同,
・Runtime.exec()可接受一个单独的字符串,这个字符串是通过空格来分隔可执行命令程序和参数的;
・ProcessBuilder的构造函数是一个字符串列表或者数组。列表中第一个参数是可执行命令程序,其他的是命令行执行是需要的参数。
■Java中提供了两种方法来启动其他程序
也就是说,
在编写Java程序时,有时候我们需要调用其他的诸如 exe,bat ,shell 这样的程序或脚本。在Java中提供了两种方法来启动其他程序:
(1) 使用Runtime的exec()方法
(2) 使用ProcessBuilder的start()方法
■代码
・Runtime
String command = "/XXXX/XXX/xxx.bat param1";
Process pro1 = Runtime.getRuntime().exec(command);
InputStream errorInfo = pro1.getErrorStream();
====
・ProcessBuilder
List<String> commandList = new ArrayList<>();
commandList.add("/XXXX/XXX/xxx.bat");
commandList.add("param1");
ProcessBuilder pb = new ProcessBuilder(commandList);
Process pro2 = pb.start();
pro2.waitFor();
===
■类的方法
・Process.waitFor()方法
processBuilder.start() 会立刻返回,不会待ps进程结束。所以Process提供waitFor方法,调用后线程阻塞,直到ps命令结束。
・Process.getErrorStream()方法
创建的子进程没有自己的终端或控制台。它的所有标准 io(即 stdin,stdout,stderr)操作都将通过三个流 (getOutputStream(),getInputStream(),getErrorStream()) 重定向到父进程。
・Process.redirectErrorStream(true)方法:
合并输出流和错误流。
Process阻塞问题_Dancen的博客-CSDN博客_process start 阻塞
public int execute()
{
int rs = 0;
String[] cmds = {...};//command and arg
ProcessBuilder builder = new ProcessBuilder(cmds);
builder.redirectErrorStream(true);
Process process = builder.start();
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String output = null;
while (null != (readLine = br.readLine()))
{
print(output);
}
rs = process.waitFor();
return rs;
}
==
■可运行代码
・java代码 (直接运行)
package com.sxz.study.process;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class TestProcess {
public static void main(String[] args) {
List<String> commandList = new ArrayList<>();
commandList.add("C:\\myBat\\CreateFile.bat");
command