进程控制java代码 java实现进程调度( 二 )


参数,或者也可以通过command()方法获取命令信息后在进行设置 。通过directory(File directory)
方法设置工作目录,通过environment()获取环境变量信息来修改环境变量 。
在使用ProcessBuilder构造函数创建一个新实例,设置环境变量、工作目录后 , 可以通过start()方法来启动新程序 , 与Runtime的exec()方法一样,该方法返回一个Process对象代表启动的程序 。
ProcessBuilder与Runtime.exec()方法的不同在于ProcessBuilder提供了
redirectErrorStream(boolean redirectErrorStream)
方法,该方法用来将进程的错误输出重定向到标准输出里 。即可以将错误输出都将与标准输出合并 。
2、Process
不管通过那种方法启动进程后,都会返回一个Process类的实例代表启动的进程,该实例可用来控制进程并获得相关信息 。Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法:
(1) void destroy()
杀掉子进程 。
一般情况下,该方法并不能杀掉已经启动的进程,不用为好 。
(2) int exitValue()
返回子进程的出口值 。
只有启动的进程执行完成、或者由于异常退出后 , exitValue()方法才会有正常的返回值,否则抛出异常 。
(3)InputStream getErrorStream()
获取子进程的错误流 。
如果错误输出被重定向,则不能从该流中读取错误输出 。
(4)InputStream getInputStream()
获取子进程的输入流 。
可以从该流中读取进程的标准输出 。
(5)OutputStream getOutputStream()
获取子进程的输出流 。
写入到该流中的数据作为进程的标准输入 。
(6) int waitFor()
导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止 。
通过该类提供的方法,可以实现与启动的进程之间通信,达到交互的目的 。
3、从标准输出和错误输出流读取信息
从启动其他程序的Java进程看 , 已启动的其他程序输出就是一个普通的输入流,可以通过getInputStream()和getErrorStream来获取 。
对于一般输出文本的进程来说,可以将InputStream封装成BufferedReader,然后就可以一行一行的对进程的标准输出进行处理 。
4、举例
(1)Runtime.exec()
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
public class Test1 {
public static void main(String[] args) {
try {
Process p = null;
String line = null;
BufferedReader stdout = null;
//list the files and directorys under C:\
p = Runtime.getRuntime().exec("CMD.exe /C dir", null, new File("C:\\"));
stdout = new BufferedReader(new InputStreamReader(p
.getInputStream()));
while ((line = stdout.readLine()) != null) {
System.out.println(line);
}
stdout.close();
//echo the value of NAME
p = Runtime.getRuntime().exec("CMD.exe /C echo %NAME%", new String[] {"NAME=TEST"});
stdout = new BufferedReader(new InputStreamReader(p
.getInputStream()));
while ((line = stdout.readLine()) != null) {
System.out.println(line);
}
stdout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
(2)ProcessBuilder
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Test2 {
public static void main(String[] args) {
try {
List list = new ArrayList();
ProcessBuilder pb = null;

推荐阅读