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

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

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

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

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

代码大致如下:

1. public class
2. 
3. public void
4.         
5. // 构造命令行 cmd /c 可以调用一个普通的.exe文件,注意目录位置
6. "cmd /c d://test";
7. // 设置工作目录
8. new File("c://");
9. 
10. try
11. null, workDir);
12. 
13. // 读取错误流和正常流的输入,否则会阻塞,不能正确获得结果
14.             InputStream stderr = process.getErrorStream();
15. "solver Error>>>");
16. 
17.             InputStream inpbuildtar = process.getInputStream();
18. "solver Info>>>");
19. 
20. int
21. if (progEnd != 0) {

22. throw new RuntimeException("Solver Error");
23.             }
24. catch
25. 

26.         }
27. 
28.     }
29. 
30. /**
31.      * 读流中数据
32.      * 
33.      * @param inputStream
34.      * @param prefix
35.      */
36. private void getInputData(final InputStream inputStream, final
37. new
38. public void
39. try
40. new
41. int
42. while (c >= 0) {

43. char) c);
44.                         c = inputStream.read();
45.                     }
46. 
47. catch
48. 
49.                 }
50.             }
51.         }.start();
52.     }
53. }