java - Runtime.getRuntime().exec 挂起

标签 java runtime.exec

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

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

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 中运行相同的命令,效果绝对很好。

最佳答案

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

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

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

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

  • 也许您的out流被阻塞;
  • 也许您正在启动的程序会写入 stderr,而您根本不会读取该内容,直到为时已晚(程序已结束)。

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

关于java - Runtime.getRuntime().exec 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20194233/

相关文章:

java - tomcat websocket servlet监听端口

java - 使用 java 恢复 PostgreSQL 数据库

java - Runtime.getRuntime().exec() 执行两行?

java - 将 UTC 时间转换为 Java 中的本地时区

java - 映射异常 : Type can not be determined for java. util.Set

java - 绕过 Jooq 乐观锁定和 DefaultRecordListener 的某些方法

java - Java中的并发访问稀疏矩阵

Android:当文件名有空格时设置文件权限时出现问题

java - 使用 Runtime.exec fork 当前进程的另一个实例

java - 无法使用 java 将命令写入共享位置上的 exe 程序