文
章
目
录
章
目
录
学习将目录复制到Java中的新位置。我们将看到仅复制目录的示例,以及深度复制目录(所有子文件夹和所有文件)的示例。
1.使用Apache Commons IO的FileUtils
1.1FileUtils.copyDirectory()
FileUtils类提供了一种干净的方法来复制文件和目录。它提供copyDirectory()方法。
- copyDirectory()将指定源目录的内容复制到指定目标目录。
- 如果目标目录不存在,则创建该目录。
- 如果目标目录已存在,则此方法将源与目标合并。
copyDirectory()是一个带有以下参数的重载方法:
- srcDir:要复制的现有目录,不能为空。
- destDir:新目录,不能为空。
- filter:要应用的过滤器,空表示复制所有目录和文件。
- preserveFileDate:如果复制的文件的最后修改日期应与原始文件相同,则为true。
copyDirectory(File srcDir, File destDir, boolean preserveFileDate)
copyDirectory(File srcDir, File destDir, FileFilter filter, boolean preserveFileDate)
1.2 FileFilter和IOFileFilter
第二个版本的方法有助于仅复制经过过滤的文件列表。例如,如果我们只想将日志文件从一个目录复制到另一个目录,我们可以使用FileFilter类。
我们还可以根据要求使用以下内置过滤器:
- DirectoryFileFilter.DIRECTORY:它接受文件作为目录。
- FileFileFilter.FILE:它接受文件作为文件(非目录)。
此外,我们可以定义自己的自定义过滤器,如本文中所述。
IOFileFilter有助于通过将它们链接为and()和or()方法来构建复杂的过滤器。例如,给定的complexFilter将有助于复制所有文件,这些文件或者是目录,或者是文本文件。
IOFileFilter txtFileFilter = FileFilterUtils.suffixFileFilter(".txt");
IOFileFilter complexFilter =
DirectoryFileFilter.DIRECTORY.or(txtFileFilter);
1.3. Java程序只复制目录结构
给定一个Java程序,它将把源位置的所有目录(及其子目录)复制到目标位置。在任何级别都不会复制文件。
File srcDir = new File("c:\\temp");
File destDir = new File("c:\\tempNew");
FileUtils.copyDirectory(srcDir, destDir, DirectoryFileFilter.DIRECTORY, false);
1.4 Java程序复制子目录和仅文本文件
给定一个Java程序,它将把源位置的所有目录(及其内部目录)复制到目标位置。它还会搜索并复制其中任何一个目录中的所有文本文件。
IOFileFilter txtFileFilter = FileFilterUtils.suffixFileFilter(".txt");
IOFileFilter complexFilter =
DirectoryFileFilter.DIRECTORY.or(txtFileFilter);
FileUtils.copyDirectory(srcDir, destDir, complexFilter, true);
1.5Java程序复制所有子目录和文件
如果我们想要深度复制所有子目录和文件,则不包括任何过滤器。
FileUtils.copyDirectory(srcDir, destDir, true);
2.使用NIO递归复制文件
要从一个位置到另一个位置深度复制一个目录及其所有子文件夹和其中的多个文件,Java没有提供直接的API。
我们需要使用java.nio.file.Files类。它的方法是walkFileTree()和copy(),必须一起使用以在Java中使用本地API构建深度复制目录的解决方案。
Java程序用于将所有子目录和文件 c:\temp 复制到新位置 c:\tempNew。
File srcDir = new File("c:\\temp");
File destDir = new File("c:\\tempNew");
copyFolder(srcDir.toPath(), destDir.toPath());
// methods
public static void copyFolder(Path src, Path dest) throws IOException {
try (Stream<Path> stream = Files.walk(src)) {
stream.forEach(source -> copy(source, dest.resolve(src.relativize(source))));
}
}
private static void copy(Path source, Path dest) {
try {
Files.copy(source, dest, StandardCopyOption.REPLACE_EXISTING);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
在上面的Java程序中:
- 如果目标目录存在,系统将抛出FileAlreadyExistsException。
- StandardCopyOption.REPLACE_EXISTING将替换目标文件夹中已存在的文件。如果我们不使用此选项,如果目标文件已存在,复制将失败。
验证文件是否正确复制。请根据需要修改代码并自由使用。