在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();
xcopy
和move
使waitFor()
无法返回,或者我完全走错了路线之间会有什么不同?
答案 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
。