`
zhaohaolin
  • 浏览: 1024676 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

利用Java.lang.Process和ProcessBuilder创建本地应用程序进程

    博客分类:
  • JAVA
 
阅读更多

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 首先当前的运行环境如下:

image

 

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));

    }
}
 
Soccer Ball
程序运行结果如下:
java_info
 

 

 

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

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

class_version_jdk

 

(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:
本文中的源码下载:processtest.zip

分享到:
评论

相关推荐

    深入研究java.lang.Process类.doc

    ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获取相关信息。 二、API 预览 1. destroy():杀掉子进程。 2. exitValue():返回子进程的...

    深入研究java.lang.ProcessBuilder类.doc

    Java中的`java.lang.ProcessBuilder`类是在J2SE 1.5版本中引入的,用于创建和管理操作系统的进程。这个类提供了比`java.lang.Process`更精细的控制,允许开发者指定启动进程的工作目录、环境变量以及错误和输出流的...

    OS.zip_OS process java_java 操作系统

    在Java中,我们不能直接操作底层的进程,但可以通过`java.lang.ProcessBuilder`类来创建和管理外部进程。例如,可以使用`ProcessBuilder.start()`方法来启动一个新的进程,`Process.waitFor()`方法来等待进程完成,...

    java创建进程,及根据命令行、pid删除进程

    在Java编程语言中,管理操作系统进程是通过Java的`java.lang.ProcessBuilder`和`java.lang.Process`类来实现的。这两个类提供了创建、控制以及与操作系统进程交互的能力。本篇文章将详细探讨如何使用Java创建进程,...

    SuggestionProvider.rar_The Process

    在Java中,创建和管理进程主要通过`java.lang.ProcessBuilder`类和`java.lang.Process`接口来实现。开发者可以通过`ProcessBuilder`启动新的操作系统进程,并与之交互,例如读取输出、写入输入和控制进程的生命周期...

    JAVA Process 使用

    创建和管理`Process`的主要类是`java.lang.ProcessBuilder`。它提供了构造进程命令行、设置工作目录、环境变量等方法,并最终用于启动新进程。 ```java ProcessBuilder pb = new ProcessBuilder("command", "arg1",...

    java管理windows进程

    首先,我们需要了解Java中的核心类`java.lang.ProcessBuilder`和`java.lang.Process`。`ProcessBuilder`是用于创建操作系统进程的类,它可以启动一个外部程序并与其进行交互。`Process`则是`ProcessBuilder`启动的...

    java 结束word进程

    首先,Java通过`java.lang.ProcessBuilder`和`java.lang.Runtime`类提供了与操作系统交互的能力。这两个类允许我们执行系统命令,包括启动、监控和管理进程。 1. **使用Runtime.exec()方法** `Runtime.getRuntime...

    基于Java的进程通信.zip

    在Java中,我们可以使用`java.lang.ProcessBuilder`类来创建和控制新的操作系统进程。 Java的进程通信主要通过以下几种方式实现: 1. **管道(Pipes)**:Java中的`java.io.PipedInputStream`和`java.io....

    OS进程管理最终强化版(Java)

    Java中的`java.lang.ProcessBuilder`类提供了创建和管理外部进程的能力,这使得Java程序员能够直接操作操作系统级别的进程。你可以创建一个新的进程,执行命令行工具,甚至可以传递参数和环境变量。例如,使用`...

    Java编写的windows任务管理器

    【Java编写的Windows任务管理器】是一款利用Java编程语言实现的、模仿Windows操作系统自带任务管理器功能的应用程序。它提供了一个用户界面,可以查看和管理运行在计算机上的进程,包括查看进程状态、CPU使用率、...

    进程管理系统(java程序+设计文档)

    在Java中,虽然不像C++那样可以直接操作系统级别的进程,但可以通过`java.lang.ProcessBuilder`和`java.lang.Process`类来创建和管理外部进程。 设计文档通常包括系统需求分析、模块划分、接口设计、数据结构与算法...

    进程交互案例

    在Java中,`java.lang.ProcessBuilder`类和`java.lang.Process`接口是进行进程交互的核心工具。`ProcessBuilder`用于创建新的操作系统进程,并允许设置命令行参数、工作目录和环境变量。一旦启动,它将返回一个`...

    OS.rar_java cpu scheduling_进程 内存 java

    在Java中,进程的创建和管理通常涉及`java.lang.ProcessBuilder`和`java.lang.Process`类。通过这些类,可以启动新的操作系统进程,传递参数,读取进程的输出,甚至控制其生命周期。 总的来说,这个实验将让你在...

    模拟进程管理(最终强化版.java0

    在Java中,我们可以使用`java.lang.ProcessBuilder`类来创建子进程。 2. **进程调度**:操作系统需要决定哪个进程应该获得CPU时间片。常见的调度算法有先来先服务(FCFS)、短作业优先(SJF)、优先级调度等。在...

    java进程间tx1

    在Java中,可以使用`java.lang.UNIXProcess`类的`signal()`方法发送信号,或者通过`java.lang.ProcessBuilder`的`redirectErrorStream()`和`redirectOutput()`来捕获进程的输出,间接实现信号处理。 4. **消息队列*...

    操作系统对进程状态的转换

    Java语言虽然不直接提供操作系统级别的进程管理API,但Java的`java.lang.ProcessBuilder`和`java.lang.Process`类允许开发人员在Java程序中创建和控制操作系统进程。例如,可以使用`ProcessBuilder.start()`方法创建...

    java常用的工具类实现

    12. **进程**: `java.lang.ProcessBuilder` 和 `java.lang.Process` 用于创建和管理操作系统进程,可以执行外部命令并获取其输出。 13. **权限树**: 自定义工具类通常用于构建和操作权限树结构,如用户角色、权限...

    java中调用本地exe文件

    在Java中,可以通过`java.lang.Runtime`类或者`java.lang.ProcessBuilder`类来启动外部程序(exe文件)。这两种方式都可以实现同样的功能,但在实际开发过程中,选择哪一种方式取决于具体需求和个人偏好。 - **...

    Java调用外部程序命令

    在Java中,调用外部程序主要涉及到三个类:`java.lang.Runtime`、`java.lang.Process` 和 `java.lang.ProcessBuilder`。下面分别介绍这些类的基本用法。 ##### 1. Runtime 类 `Runtime` 类提供了与当前Java应用...

Global site tag (gtag.js) - Google Analytics