如果您需要复制大文件,或文件以及与文件关联的所有系统权限,使用 java internal File.copy() 将过于昂贵,因此您可以将所有负载卸载到系统上。
尝试以下技巧 - 首先,将用户字符串数组作为 exec() 的参数;其次,在带有 /C 参数的“cmd”命令之后在管道中执行“xcopy”。查看我进行 isWindows() 调用的行附近的示例代码。
诀窍是您的 xcopy 命令将在 CMD shell 中执行,而 /C 将在成功执行后终止它。更多关于CMD.exe的信息。
public int sysCopyFile(Resource fromResource, Resource toResource) throws ServiceException {
int returnCode = -1;
try {
String[] copyCommand = null;
if ( IOUtils.isWindows() ) {
copyCommand = new String[] {"cmd", "/C", "copy", "/Y", fromResource.getFile().getAbsolutePath(), toResource.getFile().getAbsolutePath()};
} else if ( IOUtils.isUnix() || IOUtils.isMac() ) {
copyCommand = new String[] {"/bin/cp", "-pr", fromResource.getFile().getAbsolutePath(),toResource.getFile().getAbsolutePath()};
}
final Process p = Runtime.getRuntime().exec(copyCommand);
new StreamLogger(p.getErrorStream(), log, StreamLogger.WARN);
new StreamLogger(p.getInputStream(), log, StreamLogger.DEBUG);
returnCode = p.waitFor();
if (returnCode != 0) throw new ServiceException("Unable to to copy. Command: {" + copyCommand[0] + "} has returned non-zero returnCode: " + returnCode);
} catch (IOException e) {
throw new ServiceException(e);
} catch (InterruptedException e) {
throw new ServiceException(e);
}
return returnCode;
}