关闭

Java调用外部命令

385人阅读 评论(0) 收藏 举报

一、典型代码

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



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:400次
    • 积分:5
    • 等级:
    • 排名:千里之外
    • 原创:0篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章存档
    阅读排行
    评论排行