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



java程序执行外部命令

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

浅析Java执行外部命令的几个要点(4)——支持shell的"|","`","*","?"等特殊符号

转贴请注明出处:http://blog.csdn.com/froole在上一章已经验证了CommandExec可以很好的支持超时功能,通过它可以更方便的执行外部命令。但是,这里还有一点需要注意——那就...
  • froole
  • froole
  • 2009年01月02日 13:59
  • 3288

java中执行外部命令

在java中可以通过Runtime.getRuntime().exec(cmd)来执行外部命令,我比较常用的是调用shell脚本来完成某些工作,也可以直接执行一个os 的命令,比较调用imagemag...
  • netingcn
  • netingcn
  • 2010年01月20日 18:08
  • 1784

python调用外部命令

python调用外部命令 os.system:  输出在终端上,捕捉不到 os.popen:  只能捕捉到标准输出,捕捉不到标准错误输出 os.popen2: 返回2个对象,一个是标...
  • oaa608868
  • oaa608868
  • 2016年12月08日 01:04
  • 1239

Java如何调用外部命令?

Java如何调用外部外部命令? 我自己的体会是用Runtime.getRuntime.exec(cmd);譬如下面这个代码:String[] cmd = new String[3];if( osNam...
  • eako
  • eako
  • 2004年12月20日 13:08
  • 3635

java调用外部命令

String command = "cp 源文件 目标文件";Runtime runtime = Runtime().getRuntime();try{    runtime.exec(command...
  • mychao
  • mychao
  • 2009年04月08日 22:45
  • 287

java中调用外部命令

在java中可以通过Runtime.getRuntime().exec(cmd)来执行外部命令,我比较常用的是调用shell脚本来完成某些工作,也可以直接执行一个os 的命令,比较调用imagemag...
  • fangqun663775
  • fangqun663775
  • 2014年08月12日 11:26
  • 311

Java中调用外部命令

Java中调用外部命令public class ExecCommond{public ExecCommond(){}/**  * 执行一条命令  * @param execStr String 命令字...
  • lvyuanfang
  • lvyuanfang
  • 2004年12月18日 15:17
  • 790

java 调用外部命令

import java.io.IOException; import java.io.InputStream; import java.io.InterruptedIOException; im...
  • main_xtgjfge
  • main_xtgjfge
  • 2012年10月30日 17:08
  • 437

awk内部调用外部shell命令

Reference:http://www.computing.net/answers/unix/awk-command/6949.htmlawk uses the system function to...
  • tsingyee
  • tsingyee
  • 2011年01月04日 15:12
  • 2335
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java调用外部命令
举报原因:
原因补充:

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