Копирование каталога в Java

Научитесь копировать каталог в новое место в 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 заменит файл новым файлом, если файл уже существует в папке назначения. Если мы не используем эту опцию, копирование завершится неудачей, если целевой файл существует.

Проверьте, что файлы правильно скопированы или нет. Можете свободно изменять код и использовать его так, как вам нравится.

Исходный код на Github

Прокрутить вверх