java调用Dos命令

 比如我在工程文件夹下放了一个svm-train.exe的文件

这个exe文件调用后有输出信息。我很想知道这个exe调用过程中到底发生了什么事情。

在java中这样写

  Runtime run = Runtime.getRuntime();  
  Process child = null;
  InputStream is = null;

  File env = new File(System.getProperty("user.dir"));
   child = run.exec(cmd,null,env);

这个env是用于找到工程的当前目录,相当于进入Dos后先cd到目录,cmd就是你在dos窗口那里打的命令。

run.exec(cmd,null,env);这句就开始执行了。并创建一个Process给child

网上有很多代码有这句:

 while(true)
   {
    if(child.waitFor() == 0)
    {
     break;
    }

   }

但是注意如果进入 if(child.waitFor() == 0)
那这个程序就会卡死在这里,直到exe进程结束。这样如果你的exe会运行很长时间,那么在这段时间内就不能打印任何输出信息。

全代码如下:

  1.     private static boolean CallSVM(String cmd)
  2.     {
  3.         Runtime run = Runtime.getRuntime();     
  4.         Process child = null;
  5.         InputStream is = null;
  6.         
  7.         try
  8.         {
  9.             File env = new File(System.getProperty("user.dir"));
  10.             
  11.             child = run.exec(cmd,null,env);
  12.             
  13.             String out = null;
  14.         
  15.             
  16.             // nomal process
  17.             is = child.getInputStream();
  18.             FileWriter fw = new FileWriter(env.getAbsolutePath()+"//log.txt");            
  19.             BufferedReader br = new BufferedReader(new InputStreamReader(is));
  20.             
  21.             while((out = br.readLine())!=null)
  22.             {
  23.                 fw.write(out+"/r/n");
  24.                 System.out.println(out);
  25.             }
  26.             while(true)
  27.             {
  28.                 if(child.waitFor() == 0)
  29.                 {
  30.                     break;
  31.                 }
  32.             }
  33.             fw.write("-----------------/r/n");
  34.             
  35.             fw.close();
  36.             br.close();
  37.             
  38.         }
  39.         catch(IOException ioe)
  40.         {
  41.             System.err.println("cmd error:"+cmd);
  42.             System.err.println(ioe.getMessage());
  43.             return false;
  44.         } catch (InterruptedException e) {
  45.             // TODO Auto-generated catch block
  46.             if(child != null)
  47.                 child.destroy();
  48.             e.printStackTrace();
  49.         }
  50.         return true;
  51.     }

这里一定要输出放前,waitFor放后

   while((out = br.readLine())!=null)
   {
    fw.write(out+"/r/n");
    System.out.println(out);
   }

 


   while(true)
   {
    if(child.waitFor() == 0)
    {
     break;
    }

   }

另外程序在执行过程中while((out = br.readLine())!=null)这里也会卡住,所以不用担心,调用的dos程序还没有输出,就已经执行到waitFor()那里去了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值