日期:2014-05-20  浏览次数:21001 次

runtime.getruntime().exec(command)的一个问题?
我在java程序中想启动另一个由命令行输入的外部程序,那个外部可执行程序的功能是
不断向文件里写数据。程序是一个很成熟的开源软件(可是核心代码貌似没有)。
  我按照常规runtime.getruntime().exec(command)运行后结果是那个程序只在开始运行
的时候写了一行数据,就再也不继续写数据了,而windows资源管理器中显示该进程始终是
存在的。
  后来在网上看到有人遇到过相同的问题,但是没有解决。请教版里的大侠们,帮我向个
办法 。PS:在外部执行这个程序完全没问题。还有,当我强制terminate我的JAVA程序后
,那个一直挂起的程序居然才真正的执行了,汗!


------解决方案--------------------
给你一个正确使用的例子。你的情况多半是子进程被父进程阻塞了。原因可能是你在处理三个流上有问题
用下面执行方法试一下。不行检查你的exe程序是否要输入或什么的。


public static String exec(String[] arrCmd,String strWorkingDirectory) {
Process process = null;
String strCmdResult = "";
BufferedReader bufReader = null;
StringBuffer sbCmd = new StringBuffer();
sbCmd.append("strWorkingDirectory="+strWorkingDirectory+"\n");
int iCmdCount = arrCmd.length;
for(int i=0;i<iCmdCount;i++) {
sbCmd.append("cmd["+i+"]="+arrCmd[i]+";");
}

InputStream errIn=null;
OutputStream outS=null;
try {
if(strWorkingDirectory == null) {
process = Runtime.getRuntime().exec(arrCmd,null,null);
} else {
process = Runtime.getRuntime().exec(arrCmd,null,new File(strWorkingDirectory));
}
bufReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
errIn=process.getErrorStream();
outS=process.getOutputStream();
String strLine = null;
int iLine = 0;
while ((strLine = bufReader.readLine()) != null) {
if (iLine == 0) {
strCmdResult += strLine;
iLine++;
} else {
strCmdResult += "\n";
strCmdResult += strLine;
}
}

process.waitFor();
} catch (Exception ignore) {
dMsg.warn("Execute Cmd error:"+sbCmd.toString(),ignore);
} finally {
if( bufReader!=null){
try {
bufReader.close();
}
catch (IOException ex) {
dMsg.warn(ex.getMessage());
}
}
if(errIn!=null){
try {
errIn.close();
}
catch (IOException ex1) {
dMsg.warn(ex1.getMessage());
}
}
if(outS!=null){
try {
outS.close();
}
catch (IOException ex1) {
dMsg.warn(ex1.getMessage());
}
}
if(process != null) {
process.destroy();
}
}
return strCmdResult.trim();
}
------解决方案--------------------
如果你只一个类 里面只有这一句
runtime.getruntime().exec(command)
被调用的程序会不会执行呢?