Java调用外部命令

转载 2013年12月04日 14:24:27

一、典型代码

public static void main(String[] args) {
    String cmd = "cmd /c echo hello world";
    try {
        Process p = Runtime.getRuntime().exec(cmd);
        InputStream is = p.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String line = null;
        while((line = br.readLine()) != null){
            System.out.println(line);
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

二、API分析

当Java需要调用外部命令时,在JDK里,唯一的方法便是使用Runtime类。Runtime有几个重载方法:

    public Process exec(String command);
    public Process exec(String [] cmdArray);
    public Process exec(String command, String [] envp);
    public Process exec(String [] cmdArray, String [] envp);


你可以传入如下参数给以上方法:

    1、一个字符串,包括命令和命令参数,每个元素需要以空格隔开,就像dos或bash命令行输入一样。
    2、一个字符串数组,也包括命令和命令参数
    3、一个环境变量数组,以name=value的形式


返回Process抽象类,Process在不同的操作系统实现方式是不同的。
Process类负责处理Java与外部程序的输入输出。他有以下几个有用的方法:
    1、getErrorStream()
    获取子进程的错误流。
    2、getInputStream()
    获取子进程的输入流。
    3、getOutputStream()
    获取子进程的输出流。
    4、waitFor()
    导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止。
    5、exitValue()
    返回子进程的出口值。
其中exitValue()这个方法执行时,如果此时外部程序没有结束,会抛出IllegalThreadStateException。如果你想获得执行结果,最好使用waitFor(),它会一直等待程序结束,返回结果。值0表示程序正常结束,其他值含义视具体而定。

三、与外部程序交互:

    1、标准输入。
    有些外部命令需要你输入指令决定下一步的走向,你可以通过Process.getOutputStream()向外部程序写入数据。
    2、标准输出和错误输出。
    Process.getInputStream()可以得到外部程序的标准输出流。
    Process.getErrorStream()可以得到外部程序的错误输出流。

    需要注意的是,如果想既得到标准输出,又得到错误输出,要考虑它们与外部程序执行的异步性了。


    错误用法:
    InputStream stdInput = p.getInputStream();
    BufferedReader br1 = new BufferedReader(stdInput);
    String line1 = null;
    while ( (line1 = br1.readLine()) != null)
        System.out.println(line1);
        
    InputStream errInput = p.getErrorStream();
    BufferedReader br2 = new BufferedReader(errInput);
    String line2 = null;
    while ( (line2 = br2.readLine()) != null)
        System.out.println(line2);

    正确用法:
    Process p = Runtime.getRuntime().exec(cmd);
    InputStream stdInput = p.getInputStream();
    //异步处理
    copyInThread(stdInput);
    InputStream errInput = p.getErrorStream();
    //异步处理
    copyInThread(errInput);

    //异步处理方法
    static void copyInThread(final InputStream is){
        new Thread(){
            public void run(){
                try {
                    BufferedReader br = new BufferedReader(new InputStreamReader(is));
                    String line = null;
                    while((line = br.readLine()) != null){
                        System.out.println(line);
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }.start();
    }

四、更详细内容来自(toolcloud



相关文章推荐

关于Android中Java调用外部命令的三种方式

此所谓三种方式,只是个人认为。本人还是菜鸟初涉,所以有所错误,请指正。 个人认为,Java调用外部命令。无非三种情况: 一.是只执行命令,不考虑返回值。 二.是执行命令的同时,还需要得到返回值。...
  • synge33
  • synge33
  • 2012年03月09日 16:27
  • 3375

Java 使用Runtime.getRuntime.exec 和 ProcessBuilder 调用外部命令

这几天在做来到公司以来的第一个项目,一个可以生成statcvs report的web小工具 昨天一天纠结于调用外部命令后程序阻塞的问题,直到刚刚终于解决。 我要调用的外部指令是 cvs l...
  • xy5811
  • xy5811
  • 2011年09月02日 14:50
  • 3315

标准java调用外部命令的写法

闲着没事写了个java调用外部命令的例子,供以后参考用,不得不说代码行比用perl多了好几个数量级 perl版本 my @result = qx(ls); # runs command and...

配置java环境变量,解决javac不是内部或外部命令等问题

昨天重装了win10系统,发现以前配好的java环境变量和tomcat环境变量全都清空了,在重新配置的时候总是出现问题,即在cmd命令窗口下,输入java,显示正常,输入java -version 也...

win10配置java环境变量,解决javac不是内部或外部命令等问题

1.安装JDK,安装过程中可以自定义安装目录等信息,例如选择安装目录为D:\java\jdk1.5.0_08;   2.安装完成后,右击“我的电脑”,点击“属性”; ...

cmd界面下java可以,javac不能用--【'javac'不是内部或外部命令,也不是可运行的程序或批处理文件】

'javac'不是内部或外部命令,也不是可运行的程序或批处理文件,处理方法
  • VietDon
  • VietDon
  • 2017年02月24日 21:06
  • 1081

java程序执行外部命令

java程序执行外部命令 先来看一下java中运行外部命令(比如windows下的dos命令、linux下的shell命令)的方法: Process proc = Runtime.ge...
  • BENKG
  • BENKG
  • 2015年07月14日 19:03
  • 770

win10配置java环境变量,解决javac不是内部或外部命令等问题

版权声明:本文是博主【晴天_sun】的原创文章  已经通过他的同意转载   本文对Android开发前面的步骤JDK环境参数配置  进行了讲解  对我的帮助很大  帮助我解决了问题  于是转载 ...

运行tomcat出现set?JAVA_OPTS 不是内部或外部命令

运行tomcat出现set?JAVA_OPTS 不是内部或外部命令
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java调用外部命令
举报原因:
原因补充:

(最多只允许输入30个字)