Java 调用外部进程

本文介绍了一种解决Java程序调用外部.EXE文件时出现阻塞问题的方法。通过创建两个独立线程分别读取标准输出流和错误输出流,确保了程序能够顺利执行并获取完整的输出结果。

最近需要用Java写一个调用外部应用的程序,也就是说要在Java程序中调用外部应用(.exe)。

起初直接使用“Runtime.getRuntime().exec(String command, String[] env, File dir)”这个函数调用,但是程序老是阻塞,无法正常执行。

后来采用了读入InputStream的方法希望解决问题,可惜还是失败了,程序依然阻塞,无法执行完毕。

百般无奈之下上网搜了搜,归结起来问题就处在异常流和输入流上。网上所列举的方法,或者首先读入异常流,再读入输入流,或者启不同的线程,分别读取异常流和输入流。

经过自己的实验,在jdk1.6.0和Windows XP SP3下测试的结果,只有启两个线程分别读不通的流,程序才可以顺利执行。

代码大致如下:
  1. public class Solver {
  2.     public void solve() {
  3.         
  4.         // 构造命令行 cmd /c 可以调用一个普通的.exe文件,注意目录位置
  5.         String cmd = "cmd /c d://test";
  6.         // 设置工作目录
  7.         File workDir = new File("c://");
  8.         try {
  9.             Process process = Runtime.getRuntime().exec(cmd, null, workDir);
  10.             // 读取错误流和正常流的输入,否则会阻塞,不能正确获得结果
  11.             InputStream stderr = process.getErrorStream();
  12.             getInputData(stderr, "solver Error>>>");
  13.             InputStream inpbuildtar = process.getInputStream();
  14.             getInputData(inpbuildtar, "solver Info>>>");
  15.             int progEnd = process.waitFor();
  16.             if (progEnd != 0) {
  17.                 throw new RuntimeException("Solver Error");
  18.             }
  19.         } catch (Exception e) {
  20.            
  21.         }
  22.     }
  23.     /**
  24.      * 读流中数据
  25.      * 
  26.      * @param inputStream
  27.      * @param prefix
  28.      */
  29.     private void getInputData(final InputStream inputStream, final String prefix) {
  30.         new Thread() {
  31.             public void run() {
  32.                 try {
  33.                     StringBuilder builder = new StringBuilder();
  34.                     int c = inputStream.read();
  35.                     while (c >= 0) {
  36.                         builder.append((char) c);
  37.                         c = inputStream.read();
  38.                     }
  39.                 } catch (IOException e) {

  40.                 }
  41.             }
  42.         }.start();
  43.     }
  44. }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值