一、概述

  Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序)。       Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。       ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获取相关信息。

 
      创建进程的方法可能无法针对某些本机平台上的特定进程很好地工作,比如,本机窗口进程,守护进程,Microsoft Windows 上的 Win16/DOS 进程,或者 shell 脚本。创建的子进程没有自己的终端或控制台。它的所有标准 io(即 stdin,stdout,stderr)操作都将通过三个流 (getOutputStream(),getInputStream(),getErrorStream()) 重定向到父进程。父进程使用这些流来提供到子进程的输入和获得从子进程的输出。因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小,如果读写子进程的输出流或输入流迅速出现失败,则可能导致子进程阻塞,甚至产生死锁。

 
      当没有 Process 对象的更多引用时,不是删掉子进程,而是继续异步执行子进程。

 
 
二、API预览  
  destroy()    杀掉子进程。  exitValue()    返回子进程的出口值。  InputStream getErrorStream()    获得子进程的错误流。  InputStream getInputStream()    获得子进程的输入流。  OutputStream getOutputStream()    获得子进程的输出流。  waitFor()    导致当前线程等待,如果必要,一直要等到由该 Process 对象表示的进程已经终止。

 
 
三、如何创建Process对象,一般有一下两种方法:

 
 
1、每个 ProcessBuilder 实例管理一个进程属性集。start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。(ProcessBuilder这个是JDK5中新添加的final类,详细请参看“深入研究java.lang.ProcessBuilder类”一文。

 
 
2、Runtime.exec() 方法创建一个本机进程,并返回 Process 子类的一个实例。详细请参看“深入研究java.lang.Runtime类”一文。

 
 
四、实例

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
* 控制台处理工具箱
*
* @author leizhimin 2009-6-25 14:12:14
*/
public final class CmdToolkit {
        private static Log log = LogFactory.getLog(CmdToolkit.class);

private CmdToolkit() {
        }

/**
         * 读取控制命令的输出结果
         *
         * @param cmd                命令
         * @param isPrettify 返回的结果是否进行美化(换行),美化意味着换行,默认不进行美化,当此参数为null时也不美化,
         * @return 控制命令的输出结果
         * @throws IOException
         */
        public static String readConsole(String cmd, Boolean isPrettify) throws IOException {
                StringBuffer cmdout = new StringBuffer();
                log.info("执行命令:" + cmd);
                Process process = Runtime.getRuntime().exec(cmd);     //执行一个系统命令
                InputStream fis = process.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(fis));
                String line = null;
                if (isPrettify == null || isPrettify) {
                        while ((line = br.readLine()) != null) {
                                cmdout.append(line);
                        }
                } else {
                        while ((line = br.readLine()) != null) {
                                cmdout.append(line).append(System.getProperty("line.separator"));
                        }
                }
                log.info("执行系统命令后的结果为:\n" + cmdout.toString());
                return cmdout.toString().trim();
        }
}

深入研究java.lang.Process类的更多相关文章

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

     深入研究java.lang.ProcessBuilder类 一.概述       ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它 ...

  2. 深入研究java.lang.ThreadLocal类 (转)

    深入研究java.lang.ThreadLocal类     一.概述   ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thr ...

  3. 浅析Java.lang.Process类

    一.概述      Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序).      Process 类提供了执行从进程输入.执行输出到进程.等待进程完成.检查进程的 ...

  4. 深入研究java.lang.Runtime类【转】

    转自:http://blog.csdn.net/lastsweetop/article/details/3961911 目录(?)[-] javalang 类 Runtime getRuntime e ...

  5. [转载]使用java.lang.Process类的简单例子

    FROM: http://segmentfault.com/blog/lidonghao/1190000000372192 ProcessBuilder类是J2SE 1.5在java.lang中新添加 ...

  6. 【转】深入研究java.lang.Runtime类

    一.概述      Runtime类封装了运行时的环境.每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接.      一般不能实例化一个Runtime对象, ...

  7. 深入研究java.lang.Runtime类

    一.概述      Runtime类封装了运行时的环境.每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接.      一般不能实例化一个Runtime对象, ...

  8. 深入研究java.lang.Runtime类(转)

    一.概述      Runtime类封装了运行时的环境.每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接.      一般不能实例化一个Runtime对象, ...

  9. 深入研究java.lang.Object类

    前言:Java的类库日益庞大.所包括的类和接口也不计其数.但当中有一些非常重要的类和接口,是Java类库中的核心部分.常见的有String.Object.Class.Collection.ClassL ...

随机推荐

  1. shell获取函数的返回值

    背景:定义了一个函数,比对本地和线上服务器集群数量差别,想要获取不同集群的个数.shell和其他语言的函数返回值还是差别挺大的.   定义一个函数 functionname(){      操作内容 ...

  2. Java的反射和代理以及注解

    最近接触到java的反射和代理(接触的有点迟了...),还是有必要总结下 1. Java的反射 有的时候我们需要在程序运行的时候获取类.方法等信息用于动态运行,这个时候反射就能够帮我们找到类.方法.成 ...

  3. sql server 数据库学习

    http://m.blog.csdn.net/anxpp/article/details/51295020

  4. jDeveloper运行慢

    最近在使用 Jdeveloper 10.1.3.3 版本时发现速度奇慢无比,后经Google,发现如下解决方案:在 jdev.conf 文件的末尾加上如下两行,速度即可得到显著的提高. AddVMOp ...

  5. 骗分大法之-----分块||迷之线段树例题a

    什么是分块呢? 就是一种可以帮你骗到不少分的神奇的算法. 分块的写法有几种,我所知道的有①预处理②不预处理 不预处理的代码我看得一脸懵逼 所以我在这里就谈一下预处理的版本www 首先看一道题: 给定一 ...

  6. [SoapUI] Tips and Tricks(提示和技巧)

    https://www.soapui.org/scripting-properties/tips-tricks.html

  7. javascript的一些札记

    1. 原来放在不同js文件里面的$(document).ready(function(){})都会执行到. 2. $(window).scroll(function(){})  窗口滚动事件. 3.  ...

  8. 启动 nexus, major.minor 51.0 版本不支持

    a).Nexus的2.6版本及其以后版本 使用的Java的jdk7. b).Nexus的2.0-2.5版本 使用Java的jdk6的update30版本及其以后的jdk6版本 使用Java的jdk7的 ...

  9. centos_x64 6.4 安装jdk1.7

    1.行到user目录下新建一个java目录 #cd /usr #mkdir java #cd /usr/java/ 2.下载jdk 先从oracle找到要下载的jdk地址然后 wget http:// ...

  10. 移动文件流的读写指针---fseek

    函数原型:int fseek(FILE *stream,long offset,int origin) stream:文件指针, offset:偏移量,正数表示正向偏移,负数表示负向偏移.origin ...