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

转贴请注明出处: http://blog.csdn.com/froole

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

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

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

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

  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. public class CommandExecTest {
  4.     /**
  5.      *
  6.      * 执行结果:
  7.      *
  8.      * <pre>
  9.      *     processSuccess Result:0
  10.      *     processTimeout Result:1
  11.      *     processFail Result:9
  12.      *     >>>>>>>Sucess process:
  13.      *     ==================
  14.      *     sucess std:
  15.      *     Archive:  C:/test.zip
  16.      *     Length     Date   Time    Name
  17.      *     --------    ----   ----    ----
  18.      *         0  08/12/25 20:09   test/test.txt
  19.      *     --------                   -------
  20.      *         0                   1 file
  21.      *     ==================
  22.      *     error std:
  23.      *     ==================
  24.      *     >>>>>>>Timeout process:
  25.      *     ==================
  26.      *     sucess std:
  27.      *     ==================
  28.      *     error std:
  29.      *     ==================
  30.      *     >>>>>>>Fail process:
  31.      *     ==================
  32.      *     sucess std:
  33.      *     ==================
  34.      *     error std:
  35.      *     unzip:  cannot find either C:   est.zip or C:   est.zip.zip.
  36.      *     ==================
  37.      * </pre>
  38.      *
  39.      * @param args
  40.      * @throws Exception
  41.      */
  42.     public static void main(String[] args) throws Exception {
  43.         Runtime runtime = Runtime.getRuntime();
  44.         long timeout = 6 * 1000L;
  45.         long invterval = 500L;
  46.         CommandExec exec = new CommandExec(runtime, timeout, invterval);
  47.         // 执行成功
  48.         String[] command = new String[] { "unzip""-l""C:/test.zip" };
  49.         Process processSuccess = exec.exec(command);
  50.         System.out.println("processSuccess Result:" + processSuccess.exitValue());
  51.         // 超时执行
  52.         command = new String[] { "sleep""7" };
  53.         Process processTimeout = exec.exec(command);
  54.         System.out.println("processTimeout Result:" + processTimeout.waitFor());
  55.         // 执行失败
  56.         command = new String[] { "unzip""-l""C:/test.zip" };
  57.         Process processFail = exec.exec(command);
  58.         System.out.println("processFail Result:" + processFail.waitFor());
  59.         // 打印结果
  60.         System.out.println(">>>>>>>Sucess process:");
  61.         dispProcess(processSuccess);
  62.         System.out.println(">>>>>>>Timeout process:");
  63.         dispProcess(processTimeout);
  64.         System.out.println(">>>>>>>Fail process:");
  65.         dispProcess(processFail);
  66.     }
  67.     /**
  68.      *
  69.      * 打印输出结果
  70.      *
  71.      * @param target
  72.      * @throws IOException
  73.      */
  74.     static void dispProcess(Process target) throws IOException {
  75.         InputStream stdIn = target.getInputStream();
  76.         InputStream stdErr = target.getErrorStream();
  77.         //
  78.         try {
  79.             System.out.println("==================");
  80.             System.out.println("sucess std:");
  81.             int c1;
  82.             while ((c1 = stdIn.read()) != -1) {
  83.                 System.out.print((char) c1);
  84.             }
  85.             System.out.println("==================");
  86.             System.out.println("error std:");
  87.             int c2;
  88.             while ((c2 = stdErr.read()) != -1) {
  89.                 System.out.print((char) c2);
  90.             }
  91.             System.out.println("==================");
  92.         } finally {
  93.             try {
  94.                 if (stdIn != null) {
  95.                     stdIn.close();
  96.                 }
  97.                 if (stdErr != null) {
  98.                     stdErr.close();
  99.                 }
  100.             } catch (Exception e) {
  101.             }
  102.         }
  103.     }
  104. }

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

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
转贴请注明出处: http://blog.csdn.net/froole
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值