在Java中使用cmd复制文件时出现问题

我试图从一个文件夹复制一个具有特定扩展名的文件到另一个使用copy命令,inheritance人笏我在做,

  String[] command = new String[3]; command[0] = "cmd"; command[1] = "/c"; command[2] = "copy C:\\output\\html\\*.txt C:\\output\\"; ProcessBuilder copyFiles = new ProcessBuilder(command); p = copyFiles.start(); p.waitFor(); 

事实是,这个代码工作正常的文件less于5左右,但只是停止响应文件数量更多(甚至15个文件)! 和文件也不复制! 我不知道问题是什么,如果有人能帮助,会很高兴! 🙂

您不读取copy命令正在生成的输出。

当使用ProcessBuilder产生一个子进程时,你的子进程产生的输出被写入一个缓冲区。 如果这个缓冲区没有被读取,它最终会填满。 当它填满时, copy命令不能再写入,所以被操作系统阻塞。 然后被迫等到缓冲区中的空间被读取。

我用20个文件运行你的代码,我发现它确实挂起。

解决您的问题的一种方法是将输出从copy重定向到NULcopy大部分输出是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(); // The InputStream we get from the Process reads from the standard output // of the process (and also the standard error, by virtue of the line // copyFiles.redirectErrorStream(true) ). 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 ,将>NUL的标准输出重定向到NUL ,但不会添加2>NUL ,因为这会将标准错误重定向到NUL