目录
■Runtime、ProcessBuilder 区别:
■Java中提供了两种方法来启动其他程序
■代码
・Runtime
・ProcessBuilder
■类的方法
・Process.waitFor()方法
・Process.getErrorStream()方法
・Process.redirectErrorStream(true)方法:
■可运行代码
・java代码
・运行的bat代码
・结果
■其它资料整理
■参考
=================
■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");
commandList.add("test0001");
commandList.add("the test 0002 row");
commandList.add("theTest0003Row");
ProcessBuilder pb = new ProcessBuilder(commandList);
Process pro2 = null;
try {
pro2 = pb.start();
// =====CreateFile.bat=================================START
// @echo off
//
// set param1=%1
// set param2=%2
// set param3=%3
//
// cd %~dp0
//
// echo %param1%>testProcess.txt
// echo %param2%>>testProcess.txt
// echo %param3%>>testProcess.txt
// =====CreateFile.bat=================================END
} catch (IOException e) {
e.printStackTrace();
}
try {
pro2.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
・运行的bat代码
@echo off
set param1=%1
set param2=%2
set param3=%3
cd %~dp0
echo %param1%>testProcess.txt
echo %param2%>>testProcess.txt
echo %param3%>>testProcess.txt
・结果
====
test0001
"the test 0002 row"
theTest0003Row
===
■其它资料整理
https://blog.csdn.net/sxzlc/article/details/128607097
■参考
ProcessBuilder 、Runtime和Process 的区别_sunshine_pb的博客-CSDN博客_processbuilder和runtime的区
====