博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用Java.lang.Process和ProcessBuilder创建本地应用程序进程
阅读量:5367 次
发布时间:2019-06-15

本文共 4294 字,大约阅读时间需要 14 分钟。

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

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

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

public class ListNetStatus {
public static String executeCommand(String cmd) throws IOException {
Process ps = Runtime.getRuntime().exec(cmd); Scanner scanner = new Scanner(ps.getInputStream()); StringBuilder result = new StringBuilder(); while (scanner.hasNextLine()) {
result.append(scanner.nextLine()); result.append(System.getProperty("line.separator")); } scanner.close(); return result.toString(); } // 列出服务器当前网络状态 public static void main(String[] args) throws InterruptedException, 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

Soccer Ball首先当前的运行环境如下:

 

Soccer Ball程序代码如下:

public class ProcessTest1 {
public static String executeCommand(String[] cmd, String[] env, File dir) throws IOException, InterruptedException {
Process ps = Runtime.getRuntime().exec(cmd, env, dir); Scanner scanner1 = new Scanner(ps.getInputStream()); Scanner scanner2 = new Scanner(ps.getErrorStream()); StringBuilder result = new StringBuilder(); 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(); return result.toString(); } public static void main(String[] args) throws InterruptedException, 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 = new File( "D:/eclipse2/workspace/RegExpProject/com/test/process");
//显示当前Java运行环境信息         System.out.println(executeCommand(new String[] { "cmd", "/c", "java", "-version" }, env, dir));
//调用当前版本的Java编译器编译源码         System.out.println(executeCommand(new String[] { "cmd", "/c", "javac", "ProcessTest1.java" }, env, dir));     } }
 
程序运行结果如下:
 

 

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

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

 

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

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

public class ProcessTest2 {
public static void main(String[] args) throws InterruptedException, IOException {
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "java", "-version"); // 如果将值设置为 true,标准错误将与标准输出合并。这使得关联错误消息和相应的输出变得更容易。
// 在此情况下,合并的数据可从 Process.getInputStream() 返回的流读取 pb.redirectErrorStream(true);         pb.directory(new File( "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 = new Scanner(ps.getInputStream());         StringBuilder result = new StringBuilder(); while (scanner.hasNextLine()) {
result.append(scanner.nextLine()); result.append(System.getProperty("line.separator")); } scanner.close(); System.out.println(result.toString()); } }
 
PS:
本文中的源码下载:

转载于:https://www.cnblogs.com/ChrisWang/archive/2009/12/02/Use-Java-Lang-Process-And-ProcessBuilder-To-Create-Native-Application-Process.html

你可能感兴趣的文章
[容斥][dp][快速幂] Jzoj P5862 孤独
查看>>
Java基础之字符串匹配大全
查看>>
面向对象
查看>>
lintcode83- Single Number II- midium
查看>>
[工具] Sublime Text 使用指南
查看>>
Web服务器的原理
查看>>
#10015 灯泡(无向图连通性+二分)
查看>>
HAL层三类函数及其作用
查看>>
web@h,c小总结
查看>>
Data Structure 基本概念
查看>>
[搬运] 写给 C# 开发人员的函数式编程
查看>>
core--线程池
查看>>
他山之石:加载图片的一个小问题
查看>>
shell - 常识
查看>>
Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)
查看>>
PKUWC2018 5/6
查看>>
As-If-Serial 理解
查看>>
洛谷P1005 矩阵取数游戏
查看>>
在Silverlight中使用HierarchicalDataTemplate为TreeView实现递归树状结构
查看>>
无线通信基础(一):无线网络演进
查看>>