您的位置:首页 > 编程语言 > Java开发

浅析Java执行外部命令的几个要点(3)——如何提取执行命令的标准输出

2008-12-26 13:45 549 查看
转贴请注明出处:http://blog.csdn.com/froole

上一部分定义了一个支持超时控制功能的类——CommandExec
在这部分,将展示CommandExec的使用方法,并且向读者展示如何取得命令的执行结果并将他们打印出来。

环境描述:
假设执行环境为Windows,在C盘(系统盘)上有一个test.zip文件,里面压缩一个test.txt文本文件。
用系统自带的unzip -l命令可以显示出压缩文件的内容。
并且,系统还有sleep命令,用来暂停处理。

执行处理步骤:
生成一个新的CommandExec实现,timeout为6秒
执行系统命令[unzip -l C:/test.zip],确认其正常结束并打印执行结果;
执行[sleep 7],让处理暂停7秒,但是,到了6秒的时候程序会被强制终止,从出口值可以判断[sleep 7]的执行结果是失败的;
执行[unzip -l C:/test.zip],由于Java中将“C:/test.zip”认为“C:test.zip”,由于找不到文件执行将失败,并打印出错误信息。

以下是代码,有兴趣的读者可以在自己的电脑上测试一下。

import java.io.IOException;
import java.io.InputStream;

public class CommandExecTest {

    /**
     *
     * 执行结果:
     *
     * <pre>
     *     processSuccess Result:0
     *     processTimeout Result:1
     *     processFail Result:9
     *     >>>>>>>Sucess process:
     *     ==================
     *     sucess std:
     *     Archive:  C:/test.zip
     *     Length     Date   Time    Name
     *     --------    ----   ----    ----
     *         0  08/12/25 20:09   test/test.txt
     *     --------                   -------
     *         0                   1 file
     *     ==================
     *     error std:
     *     ==================
     *     >>>>>>>Timeout process:
     *     ==================
     *     sucess std:
     *     ==================
     *     error std:
     *     ==================
     *     >>>>>>>Fail process:
     *     ==================
     *     sucess std:
     *     ==================
     *     error std:
     *     unzip:  cannot find either C:   est.zip or C:   est.zip.zip.
     *     ==================
     * </pre>
     *
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        Runtime runtime = Runtime.getRuntime();
        long timeout = 6 * 1000L;
        long invterval = 500L;
        CommandExec exec = new CommandExec(runtime, timeout, invterval);

        // 执行成功
        String[] command = new String[] { "unzip", "-l", "C:/test.zip" };
        Process processSuccess = exec.exec(command);
        System.out.println("processSuccess Result:" + processSuccess.exitValue());

        // 超时执行
        command = new String[] { "sleep", "7" };
        Process processTimeout = exec.exec(command);
        System.out.println("processTimeout Result:" + processTimeout.waitFor());

        // 执行失败
        command = new String[] { "unzip", "-l", "C:/test.zip" };
        Process processFail = exec.exec(command);
        System.out.println("processFail Result:" + processFail.waitFor());

        // 打印结果
        System.out.println(">>>>>>>Sucess process:");
        dispProcess(processSuccess);
        System.out.println(">>>>>>>Timeout process:");
        dispProcess(processTimeout);
        System.out.println(">>>>>>>Fail process:");
        dispProcess(processFail);
    }

    /**
     *
     * 打印输出结果
     *
     * @param target
     * @throws IOException
     */
    static void dispProcess(Process target) throws IOException {
        InputStream stdIn = target.getInputStream();
        InputStream stdErr = target.getErrorStream();
        //
        try {
            System.out.println("==================");
            System.out.println("sucess std:");
            int c1;
            while ((c1 = stdIn.read()) != -1) {
                System.out.print((char) c1);
            }
            System.out.println("==================");
            System.out.println("error std:");
            int c2;
            while ((c2 = stdErr.read()) != -1) {
                System.out.print((char) c2);
            }
            System.out.println("==================");
        } finally {
            try {
                if (stdIn != null) {
                    stdIn.close();
                }
                if (stdErr != null) {
                    stdErr.close();
                }
            } catch (Exception e) {
            }
        }
    }
}

相关:
-浅析Java执行外部命令的几个要点(1)
-浅析Java执行外部命令的几个要点(2)
-浅析Java执行外部命令的几个要点(3)
-浅析Java执行外部命令的几个要点(4)

<script type="text/javascript"><!--
google_ad_client = "pub-2097865745512830";
/* 728x90, 作成済み 08/12/22 */
google_ad_slot = "5461334436";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
转贴请注明出处:http://blog.csdn.net/froole
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息