Runtime.getRuntime()。exec挂起

时间:2013-11-25 13:24:48

标签: java runtime.exec

我有一个java jar文件,它调用java程序(命令)。

当我在命令promt中运行它时,生成的命令工作正常。

Process proc = Runtime.getRuntime().exec("cmd.exe /C "+ Command);

        BufferedReader stdIn = new BufferedReader(new 
                     InputStreamReader(process.getInputStream()));

                BufferedReader stdErr = new BufferedReader(new 
                     InputStreamReader(process.getErrorStream()));

            String output=null;
            while((output=stdIn.readLine())!=null)
            {
                System.out.println("output is:"+output);
                out.write(output);
                out.newLine();

            }
            while((output=stdErr.readLine())!=null)
            {
                System.out.println("error output is:"+output);
                out.write(output);
                out.newLine();

            } 
            try {
process.waitFor();
....
....
....

我试过ProcessBuilder:

ProcessBuilder proc = new ProcessBuilder("cmd.exe", "/C", Command);         proc.redirectErrorStream(true);
proc.start();

但是这会引发错误:

java.io.IOException: Cannot run program "java -Xmx1024M ......"
CreateProcess error=2, The system cannot find the file specified

我可以在promt中运行完全相同的命令。

1 个答案:

答案 0 :(得分:1)

使用

 new ProcessBuilder("cmd.exe", "/C", Command);

你已经使用了构造函数的varargs重载。这意味着假定该命令已经被解析为参数。但是,您将完整的Command作为单个参数传递,这意味着cmd将整个命令行java -Xmx...解释为要运行的命令(文件名)。

坚持使用单个字符串,依靠ProcessBuilder类来解析它,或预先解析所有内容。

至于你遇到的问题,可能有以下几个原因:

  • 也许您的out信息流阻塞了;
  • 也许你开始的节目写到stderr,你根本不读,直到已经太晚了(节目已经结束)。

您的第二种方法可以通过合并stdoutstderr来解决此问题。