用java程序创建和控制子进程_利用Java.lang.Process和ProcessBuilder创建本地应用程序进程...

本文介绍了如何使用Java的ProcessBuilder和Runtime.exec方法创建和控制子进程。通过示例展示了如何设置环境变量、工作目录以及如何获取进程输出,详细解析了这两个方法的使用技巧和注意事项。
摘要由CSDN通过智能技术生成

ProcessBuilder.start()和Runtime.exec方法都可以创建一个本地(native)进程,并且返回代表这个进程的Java Process实例.

Java.lang.process类能可以用来控制这个进程和获得进程的一些信息.

(1)调用系统命令创建进程并且获取其命令输出,使用Runtime.exec(String cmd):

public classListNetStatus {

public staticString executeCommand(String cmd) throwsIOException {

Process ps = Runtime.getRuntime().exec(cmd);

Scanner scanner = newScanner(ps.getInputStream());

StringBuilder result = newStringBuilder();

while(scanner.hasNextLine()) {

result.append(scanner.nextLine());

result.append(System.getProperty("line.separator"));

}

scanner.close();

returnresult.toString();

}

// 列出服务器当前网络状态public static voidmain(String[] args) throwsInterruptedException, IOException {

System.out.println(executeCommand("netstat"));

}

}

Runtime.exec(String cmd)在JDK中还是调用的是 Runtime.getRuntime().exec(String[] cmdarray, String[] envp, File dir)这个方法,

包括exec(cmdarray, envp),Runtime.getRuntime().exec(cmdarray)都是。

那我们就来重点研究一下Runtime.getRuntime().exec(String[] cmdarray, String[] envp, File dir),

他表示在特定环境和特定工作目录下,执行给定的命令和参数.

1.String[] cmdarray  是一个String数组形参,表示需要被调用的命令和这个命令的参数

2.String[] envp      表示环境变量,他的存储格式是name=value或null,如果envp为null,则创建的子进程将继承其父进程的环境变量

3.File     dir           子进程的工作目录,如果为null,那么这个子进程将继承父进程的工作目录.

(2)下面我们的这个程序,我们将演示这个方法,这个程序在JDK 6.0下面运行启动一个子进程,重写的他的环境变量如JAVA_HOME和Path,将他们改为JDK5.0的运行环境,设置工作目录,然后调用Java -version去显示当前的环境和编译源文件ProcessTest1.java

58_58.gif首先当前的运行环境如下:

fb360407983c61e782c1cd25b3cec2cd.png

58_58.gif程序代码如下:

public classProcessTest1 {

public staticString executeCommand(String[] cmd, String[] env, File dir)

throwsIOException, InterruptedException {

Process ps = Runtime.getRuntime().exec(cmd, env, dir);

Scanner scanner1 = newScanner(ps.getInputStream());

Scanner scanner2 = newScanner(ps.getErrorStream());

StringBuilder result = newStringBuilder();

while(scanner1.hasNextLine()) {

result.append(scanner1.nextLine());

result.append(System.getProperty("line.separator"));

}

while(scanner2.hasNextLine()) {

result.append(scanner2.nextLine());

result.append(System.getProperty("line.separator"));

}

scanner1.close();

scanner2.close();

returnresult.toString();

}

public static voidmain(String[] args) throwsInterruptedException,

IOException {

//设置工作目录String[] env = { "JAVA_HOME=C:/Program Files/Java/jdk1.5.0_06",

"PATH=C:/Program Files/Java/jdk1.5.0_06/bin"};

//设置环境变量File dir = newFile(

"D:/eclipse2/workspace/RegExpProject/com/test/process");

//显示当前Java运行环境信息

System.out.println(executeCommand(newString[] { "cmd", "/c", "java",

"-version"}, env, dir));

//调用当前版本的Java编译器编译源码

System.out.println(executeCommand(newString[] { "cmd", "/c", "javac",

"ProcessTest1.java"}, env, dir));

}

}

58_58.gif程序运行结果如下:

ef260bd0e700ec1695e8b58a6238d13c.png

然后查看这个时候生成ProcessTest1.class文件,利用jdk中的命令:javap –verbose ProcessTest1 对其反汇编,会看到此时class的major version:49,如果对JDK的版本知识有一定了解的话,就会知道此时的class就是被java5编译的,而不是Java6.

如果想了解更多可以看下表(摘自KenWu的博文):

f0de535cf1f785424567b7275d86f67d.png

(3)ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,也可以用来创建子进程,并且比用Runtime.exec使用更方便.

58_58.gif以下代码演示了利用ProcessBuilder实现(2)中的显示Java运行环境的功能:

public classProcessTest2 {

public static voidmain(String[] args) throwsInterruptedException,

IOException {

ProcessBuilder pb = newProcessBuilder("cmd", "/c", "java", "-version");

// 如果将值设置为 true,标准错误将与标准输出合并。这使得关联错误消息和相应的输出变得更容易。

// 在此情况下,合并的数据可从 Process.getInputStream() 返回的流读取pb.redirectErrorStream(true);

pb.directory(newFile(

"D:/eclipse2/workspace/RegExpProject/com/test/process"));

String path = pb.environment().get("Path");

pb.environment().put("Path", "C:/Program Files/Java/jdk1.5.0_06/bin");

pb.environment().put("JAVA_HOME", "C:/Program Files/Java/jdk1.5.0_06");

Process ps = pb.start();

Scanner scanner = newScanner(ps.getInputStream());

StringBuilder result = newStringBuilder();

while(scanner.hasNextLine()) {

result.append(scanner.nextLine());

result.append(System.getProperty("line.separator"));

}

scanner.close();

System.out.println(result.toString());

}

}

PS:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值