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

解决方案 »

  1.   

    调用一个批处理程序,不要直接调用exe程序看看!
      

  2.   

    给你一个正确使用的例子。你的情况多半是子进程被父进程阻塞了。原因可能是你在处理三个流上有问题
    用下面执行方法试一下。不行检查你的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();
        }
      

  3.   

    如果你只一个类 里面只有这一句
    runtime.getruntime().exec(command)
    被调用的程序会不会执行呢?