0

在 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();

xcopya 和 amove之间有什么不同waitFor()之处?

4

2 回答 2

1

我怀疑您没有使用流程标准输出/错误,这会阻止流程。如果您的代码不使用此输出,则生成的进程将挂起(并且您将挂起等待该进程!)。为什么两个命令之间的行为差​​异?可能是由于返回的数据量和对发布缓冲区的影响。

有关更多详细信息,请参阅此答案

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

于 2013-05-14T14:46:01.347 回答
1

xcopy可能只是碰巧产生比 更多move的输出,填充输出缓冲区并阻塞直到它被刷新。Java 中的默认行为是将子进程的 stdout/stderr 通过管道传输到InputStreams 中,然后您需要以编程方式读取它们,以免子进程的缓冲区溢出。

如果是后者,解决方案很简单,实际上无论如何你都应该这样做:使用ProcessBuilder准备系统调用并调用inheritIO它。这将为子进程重用您父进程的标准输入和标准输出。

附注,xcopy是一个常规.exe文件,不需要包装成cmd.exe /c.

于 2013-05-14T14:47:07.043 回答