Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1006593
  • 博文数量: 150
  • 博客积分: 3017
  • 博客等级: 少校
  • 技术积分: 3829
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 14:40
个人简介

Now in Baidu WISE team

文章分类

全部博文(150)

文章存档

2014年(8)

2013年(31)

2012年(111)

分类: Java

2013-11-26 17:47:53

工作原因,需要写一个程序,使用CMD调用另外一个jar,把输出保存在string中。
看着没啥的一个东西,结果折腾了我一天。
Key point:
1.   当你重定向了输出以后,必须把process.getInputStream()和process.getErrorStream()里面都处理干净,程序才会结束。
     比如你调用的程序输出了error,结果你处理输出的时候只处理了process.getInputStream(),程序就会一直卡在那。

2.  因为error和output可能是混合输出的,所以,你必须起两个线程,同时处理这两个流,否则就锁死了
例如有如下输出:
  1.  start ......
  2.  error ......
  3.  end ......

1和3是标准输出流,2是错误流。 如果你处理的时候先处理了标准输出流,那么会先处理1, 这时候就在等待2被处理,如果你没写处理错误流的方法,那么程序就会卡在这,直到你处理完2.
同样的,如果你是单线程,卡在处理标准输出流的位置,同样一直进不了错误流的处理部分,还是卡死。
所以,需要起两个进程,并行处理,一个读标准输出,一个读错误,这两个就可以交替进行了。

下面贴上代码:

点击(此处)折叠或打开

  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;

  5. public class Calculate {


  6.     private static String RunCMD(String cmdstr) throws IOException, InterruptedException {

  7.         StringBuilder sbout = new StringBuilder();

  8.         // run.exec("cmd /k shutdown -s -t 3600");
  9.         Process process = Runtime.getRuntime().exec("cmd.exe /c " + cmdstr);

  10.         BufferedReader bfout = new BufferedReader(new InputStreamReader(
  11.                 process.getInputStream()));
  12.         final InputStreamReader err = new InputStreamReader(
  13.                 process.getErrorStream());
  14.         
  15.         final InputStreamReader in = new InputStreamReader(
  16.                 process.getInputStream());
  17.         String outline = "";
  18.         //int flag = process.waitFor();
  19.         new Thread() {
  20.             public void run() {
  21.                 BufferedReader bferr = new BufferedReader(err);
  22.                 String errline = "";
  23.                 StringBuilder sberr = new StringBuilder();
  24.                 try {
  25.                     while ((errline = bferr.readLine()) != null) {
  26.                         sberr.append(errline);
  27.                         sberr.append("\n");
  28.                         System.out.println("!!!!!!!!" + errline);
  29.                     }
  30.                 } catch (Exception e) {
  31.                     // TODO Auto-generated catch block
  32.                     e.printStackTrace();
  33.                 }
  34.                 finally{
  35.          try {
  36.               err.close();
  37.          } catch (IOException e) {
  38.          e.printStackTrace();
  39.          }
  40.          }

  41.             }
  42.         }.start();
  43.         new Thread() {
  44.             public void run() {
  45.                 BufferedReader bferr = new BufferedReader(in);
  46.                 String errline = "";
  47.                 StringBuilder sberr = new StringBuilder();
  48.                 try {
  49.                     while ((errline = bferr.readLine()) != null) {
  50.                         sberr.append(errline);
  51.                         sberr.append("\n");
  52.                         System.out.println("**********" + errline);
  53.                     }
  54.                 } catch (Exception e) {
  55.                     // TODO Auto-generated catch block
  56.                     e.printStackTrace();
  57.                 }

  58.             }
  59.         }.start();

  60.         //process.waitFor();
  61.         return "";

  62.     }

  63.     public static void main(String[] args) throws InterruptedException {
  64.         try {
  65.             RunCMD("java -jar CLI.jar oupload -c config.ini -f userdata.csv");
  66.         } catch (IOException e) {
  67.             // TODO Auto-generated catch block
  68.             e.printStackTrace();
  69.         }
  70.         // RunCMD("dir");
  71.     }

  72. }


有赖于下面的reference,才能解决问题,不过原文里面说的太不明显了,很容易跳过。
reference: http://blog.csdn.net/ly5156/article/details/7051436
阅读(3977) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~