Runtime、ProcessBuilder的区别(Java中,两种方法来启动其他程序)

目录

■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 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 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

・结果

Runtime、ProcessBuilder的区别(Java中,两种方法来启动其他程序)_第1张图片

 ====

test0001
"the test 0002 row"
theTest0003Row

===

■其它资料整理

https://blog.csdn.net/sxzlc/article/details/128607097

■参考

ProcessBuilder 、Runtime和Process 的区别_sunshine_pb的博客-CSDN博客_processbuilder和runtime的区

====

你可能感兴趣的:(java,#,bat,doc命令,#,shell,java)