Научитесь копировать каталог в новое место в Java. Мы увидим примеры копирования только каталогов, а также глубокого копирования каталога(всех подпапок и всех файлов).
1. Использование FileUtils Apache Commons IO
1.1.FileUtils.copyDirectory()
Класс FileUtils предоставляет чистый способ копирования файлов и каталогов. Он предоставляет метод copyDirectory().
- copyDirectory() копирует содержимое указанного исходного каталога в указанный целевой каталог.
- Если целевой каталог не существует, он создается.
- Если целевой каталог существует, то этот метод объединяет исходный каталог с целевым.
copyDirectory() — это перегруженный метод со следующими параметрами:
- srcDir: существующий каталог для копирования, не должен быть пустым.
- destDir: новый каталог, не должен быть пустым.
- фильтр: применяемый фильтр, null означает копирование всех каталогов и файлов.
- preserveFileDate : true, если дата последнего изменения копии должна совпадать с датой оригинала.
copyDirectory(File srcDir, File destDir, boolean preserveFileDate)copyDirectory(File srcDir, File destDir, FileFilter filter, boolean preserveFileDate)
1.2 Фильтр файлов и фильтр ввода-вывода
Вторая версия метода помогает копировать только отфильтрованный список файлов. Например, если мы хотим скопировать только файлы журналов из одного каталога в другой, мы можем использовать класс 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.5 Программа Java для копирования всех подкаталогов и файлов
Не включайте никаких фильтров, если мы хотим выполнить глубокое копирование всех подкаталогов и файлов.
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());//Copy methodspublic 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 заменит файл новым файлом, если файл уже существует в папке назначения. Если мы не используем эту опцию, копирование завершится неудачей, если целевой файл существует.
Проверьте, что файлы правильно скопированы или нет. Можете свободно изменять код и использовать его так, как вам нравится.