Java process.waitFor()不返回

时间:2013-05-14 14:43:47

标签: java windows-7 process runtime.exec

在Windows 7 64位上运行64位Java 1.7.0_17,下面显示的p.waitFor()永远不会返回。

String move_command="cmd.exe /c xcopy /Y /E "+x86_release+" "+path+"\\";
Process p;
p = Runtime.getRuntime().exec(move_command);
p.waitFor();

如果我使用Windows资源管理器,看起来所有文件都被复制(相同的数字,相同的大小等)

如果我执行以下操作,则waitFor()会返回:

String move_command="cmd.exe /c move /Y "+x86_release+" "+path+"\\";
Process p;
p = Runtime.getRuntime().exec(move_command);
p.waitFor();

xcopymove使waitFor()无法返回,或者我完全走错了路线之间会有什么不同?

2 个答案:

答案 0 :(得分:1)

我怀疑你没有消耗过程标准out / err,而这阻碍了这个过程。如果您的代码不使用此输出,则生成的进程将挂起(您将等待该进程!)。为什么两个命令之间的行为不同?可能是由于返回的数据量和对发布缓冲区的影响。

有关详细信息,请参阅this answer

我还会调查Apache Commons FileUtils.copyDirectory(),这样您就不必生成一个全新的过程来复制文件。

答案 1 :(得分:1)

xcopy可能恰好产生比move更多的输出,填充输出缓冲区并阻塞直到刷新。 Java中的默认行为是将子进程的stdout / stderr管道化为InputStream,然后需要以编程方式读取,以免子进程的缓冲区溢出。

如果是后一种情况,解决方案很简单,事实上你应该这样做:使用ProcessBuilder准备系统调用并在其上调用inheritIO。这将重用父进程的stdin和stdout用于子进程。

附注,xcopy是常规.exe文件,不需要换行cmd.exe /c