您没有读取
copy
命令生成的输出。
使用ProcessBuilder生成子进程时,您的子进程生成的输出会被写入缓冲区。如果不从中读取该缓冲区,它最终会填满。当它填满时,
copy
命令无法再向其中写入内容,因此被操作系统阻塞。然后,它被迫等待通过从中读取来释放缓冲区中的空间。
我运行了您的代码并复制了20个文件,发现它确实挂起了。
解决问题的一种方法是将
copy
的输出重定向到
NUL
。大多数
copy
的输出是它已复制的所有文件的列表,您可能不太关心这些内容。要执行此重定向,请修改分配给
command[2]
的行如下:
command[2] = "copy C:\\output\\html\\*.txt C:\\output\\ >NUL 2>NUL";
然而,如果复制文件出现问题,如果你这样做的话可能不会知道。或者,你可以阅读
copy
命令生成的输出。以下代码将其发送到
System.out
,但是如果您希望,可以轻松地将其发送到其他地方或完全忽略它:
String[] command = { "cmd", "/c", "copy C:\\output\\html\\*.txt C:\\output\\" };
ProcessBuilder copyFiles = new ProcessBuilder(command);
copyFiles.redirectErrorStream(true);
p = copyFiles.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
do {
line = reader.readLine();
if (line != null) { System.out.println(line); }
} while (line != null);
reader.close();
p.waitFor();
我用同样的20个文件对每种方法进行了快速测试,两种方法都没有卡住。
编辑:您还可以尝试“混合”方法,即丢弃
copy
写入标准输出的内容(例如它正在复制的文件列表),但使用第二种方法读取它写入标准错误的内容(例如错误消息)。为此,您需要添加
>NUL
,将
copy
的标准输出重定向到
NUL
,但不需要添加
2>NUL
,因为这会将标准错误重定向到
NUL
。
p.waitFor()
这一行。这样可以解决卡住的问题,但是我发现没有文件被复制。 - Luke Woodward