java调用其他程序的问题

 

大家都知道java调用cmd 用的是Runtimeexec()方法。该方法最终重启一个进程去执行命令,因为该方法最终调用了
ProcessBuilder

1 public Process exec(String[] strings, String[] strings_2_, File file)
2    throws IOException {
3    return new ProcessBuilder(strings).environment(strings_2_).directory
4           (file).start();
5    }
既然是重启了一个进程,那么就存在异步的问题,但是在很多情况在更想同步的调用Runtimeexec(),那么怎么办呢?
Runtime.exec()
的返回值Process提供了waitFor()方法,可以达到阻塞新进程的目的。但是只调用waitFor(),该字线程就会
一直阻塞,所以只调用waitFor()还是不够的,我们需要以读取他的输出流的方式来阻塞住线程,当输出流读取结束的
时候让阻塞结束,代码如下:
   通过读取输出流和调用process.waitFor()可以的实现调用Runtime.exec()的同步。
  
另外还有一种情况可以使Runtime.exec()出现阻塞,Runtimeexec()在执行时会产生两种输出流:错误输出流和标准输出流,当进程结束时会关闭这两个流,在上面的代码里只读取了标准输出流而没有导致错误输出流,由于错误输出流中的数据没有被读取,进程就不会结束,因此调用readLine()方法时整个程序就会阻塞,因此,我们不仅要读取标准输出流还要读取错误输出流,由于读取这些流都会阻塞,所以想同时读取两个流还不是那么容易,一种办法就是启动线程分别读取不同的输出流,另外一个办法就是使用ProcessBuilder来执行(前面已经说过了Runtime.exec()最终也是调用ProcessBuilder来执行的),因为ProcessBuilder有一个redirectErrorStream(),方法设置为redirectErrorStream(true),就可以使错误输出流合并到标准输出流,这样我们就只需要读取标准输出流就可以完全解决问题了,代码如下:
还是也介绍下使用线程来分别读取错误输出流和标准输出流吧:
 

好了,今天就先写到这里吧。



posted on 2008-10-09 13:32 linda 阅读(1772) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 

导航

<2008年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

统计

常用链接

留言簿(1)

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜