gpt4 book ai didi

java - 在Java中使用cmd复制文件的问题

转载 作者:可可西里 更新时间:2023-11-01 13:30:36 26 4
gpt4 key购买 nike

我正在尝试使用 copy 命令将一堆具有特定扩展名的文件从一个文件夹复制到另一个文件夹,这是我正在做的,

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

问题是,此代码对于少于 5 个左右的文件工作正常,但在文件数量更多时停止响应(即使是 15 个文件)!!而且文件也没有被复制!!我不知道问题是什么,如果有人能提供帮助,我会很高兴! :)

最佳答案

您没有读取 copy 命令生成的输出。

使用 ProcessBuilder 生成子进程时,子进程生成的输出将写入缓冲区。如果不读取此缓冲区,它最终会填满。当它填满时,copy 命令无法再写入,因此被操作系统阻止。然后它被迫等待,直到通过读取缓冲区在缓冲区中腾出空间。

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

解决问题的一种方法是将输出从 copy 重定向到 NULcopy 的大部分输出是它已复制的所有文件的列表,您可能不太关心这些。要执行此重定向,请将分配给 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,它将 copy 的标准输出重定向到 NUL,但您不会添加2>NUL,因为它将标准错误重定向到 NUL

关于java - 在Java中使用cmd复制文件的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5859755/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com