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

Har*_*hna 5 java windows command-line runtime process

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

 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();
Run Code Online (Sandbox Code Playgroud)

问题是,这个代码适用于小于5左右的文件,但只是停止响应文件的数量更多(即使是15个文件)!并且文件也不被复制!! 我不知道问题是什么,如果有人可以提供帮助,我会很高兴!:)

Luk*_*ard 6

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

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

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

解决问题的一种方法是将输出重定向copyNUL.大多数输出copy是它复制的所有文件的列表,你可能不太关心.要执行此重定向,请修改分配给command[2]以下内容的行:

command[2] = "copy C:\\output\\html\\*.txt C:\\output\\ >NUL 2>NUL";
Run Code Online (Sandbox Code Playgroud)

但是,如果复制文件时出现问题,则执行此操作时可能不会知道.

或者,您可以读取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();
Run Code Online (Sandbox Code Playgroud)

我用相同的20个文件对每个方法进行了快速测试,两种方法都没有挂起.

编辑:您可能还想尝试一种"混合"方法,通过丢弃copy写入标准输出的内容(例如,它正在复制的文件列表),但使用第二种方法读取它写入标准错误的内容(例如错误消息) .要执行此操作,您需要添加>NUL,将标准输出重定向copyNUL,但您不会添加2>NUL,因为它会将标准错误重定向到NUL.