从Java执行的Windows进程不会终止

我正在从Java创build一个Windows进程。 我的问题是,这个过程不会终止。 这是一个示例程序:

import java.io.IOException; public class Test { /** * @param args * @throws IOException * @throws InterruptedException */ public static void main(String[] args) throws IOException, InterruptedException { Process process = Runtime.getRuntime().exec("cmd /c dir"); process.waitFor(); } } 

由于我理解的原因,这个程序从来没有完成。 如果将“cmd / c dir”replace为ipconfig以及其他内容,则情况如此。

我可以看到使用ProcessExplorer java创buildcmd进程。 这个样本显然是一个简化; 在我原来的程序中,我发现如果在一段时间后调用process.destroy()并检查cmd进程的输出,那么命令将成功执行。

我已经尝试了Java 1.5和1.6的各种版本。 我的操作系统是Windows XP Pro,SP 2。

可能只需要读取进程的stdout和stderr,或者从输出缓冲区已满的时候就会挂起。 如果将stderr重定向到stdout,这是最简单的,只是为了安全起见:

 public static void main(String[] args) throws IOException, InterruptedException { String[] cmd = new String[] { "cmd.exe", "/C", "dir", "2>&1" }; Process process = Runtime.getRuntime().exec(cmd); InputStream stdout = process.getInputStream(); while( stdout.read() >= 0 ) { ; } process.waitFor(); } } 

请参阅此链接以获取解释。

你需要读取输入流。 此外,Java进程不像一个DOS外壳。 你需要自己传递参数:

 String[] cmd = new String[3]; cmd[0] = "cmd.exe" ; cmd[1] = "/C" ; cmd[2] = "dir"; Runtime rt = Runtime.getRuntime(); Process proc = rt.exec(cmd); 

您应该尝试使用ProcessBuilder ,如下所示。 不知道有什么不同,但这为我们解决了很多问题。

 ProcessBuilder pb = new ProcessBuilder(CMD, ARG1, ARG2); Process p = pb.start();