转载自 Java调用exe阻塞
今天遇到了个奇怪的问题,用VC写了个小程序,编译成exe文件,然后用Java去调,居然卡住不运行了。
如果双击这个exe程序,单独让它运行,是可以的,那么为什么用Java调用就不好使了呢?
上网查了一下,原来是由于缓冲区的问题,也就是说Process的getErrorStream和getInputStream缓冲区没有清空。我在VC里要打印的东西太多了,以至于填满了缓冲区,这是缓冲区需要释放,我不但没释放还一个劲的运行程序,那么Java就卡在那里了。表面上好像是exe出了问题,其实是这个Process的缓冲区造成的。
解决方法:
InputStream is1 = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is1));
try {
while(br.readLine() != null) ;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
InputStream is2 = process.getErrorStream();
if(null != is2) {
BufferedReader br2 = new BufferedReader(new InputStreamReader(is2));
StringBuilder buf = new StringBuilder(); // 保存输出结果流
String line = null;
try {
while(br2.readLine() != null) ;
buf.append(line);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("输出结果为:" + buf.toString());
}
将上述代码加入程序就可以解决缓冲区的问题,建议单独开启线程去多。
我的代码里不需要getErrorStream()部分的代码,这两部分针对实际情况自由选择。
将上述代码加入程序就可以解决缓冲区的问题,建议单独开启线程去多。
我的代码里不需要getErrorStream()部分的代码,这两部分针对实际情况自由选择。