Метод move() класса java.nio.file.Files в Java

Java File Java java.nio.file.Files


java.nio.file.Files.move()Этот метод является основным методом в пакете Java NIO (New I/O) для перемещения или переименования файлов и каталогов. Он предоставляет по сравнению с традиционнымиjava.io.Fileклассами более мощные и гибкие возможности работы с файлами.

Синтаксис метода

public static Path move(Path source, Path target, CopyOption... options) throws IOException

Описание параметра

Название параметра Type Описание
source Путь Путь к исходному файлу или каталогу для перемещения
target Путь Целевой путь
options CopyOption... Необязательные параметры перемещения (varargs)

Общие параметры CopyOption

  • StandardCopyOption.REPLACE_EXISTING: Если целевой файл уже существует, заменить его.
  • StandardCopyOption.ATOMIC_MOVE: Обеспечивает атомарность операции перемещения.
  • LinkOption.NOFOLLOW_LINKS: Не следует по символическим ссылкам.

Сведения о функции метода

Базовое перемещение файла

Простейшая операция перемещения, перемещающая файл из одного расположения в другое:

Пример

Path source = Paths.get("C:/temp/source.txt");
Path target = Paths.get("C:/temp2/target.txt");
Files.move(source, target);

Переименование файла

Метод move также можно использовать для переименования файлов:

Пример

Path source = Paths.get("C:/temp/oldname.txt");
Path target = Paths.get("C:/temp/newname.txt");
Files.move(source, target);

Перемещение каталога

Перемещение всего каталога (включая его содержимое):

Пример

Path sourceDir = Paths.get("C:/temp/mydir");
Path targetDir = Paths.get("C:/temp2/mydir");
Files.move(sourceDir, targetDir);

Продвинутое использование

Перезапись существующих файлов

ИспользованиеREPLACE_EXISTINGопция перезаписи существующего целевого файла:

Пример

Path source = Paths.get("C:/temp/source.txt");
Path target = Paths.get("C:/temp2/target.txt");
Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);

Атомарное перемещение

Убедитесь, что операция перемещения атомарна (либо полностью успешна, либо полностью завершается неудачей):

Пример

Path source = Paths.get("C:/temp/source.txt");
Path target = Paths.get("C:/temp2/target.txt");
Files.move(source, target, StandardCopyOption.ATOMIC_MOVE);

Обработка исключений

move()Метод может выбрасывать следующие исключения:

  • IOException: Выбрасывается при возникновении ошибки ввода-вывода.
  • FileAlreadyExistsException: Целевой файл уже существует, и неREPLACE_EXISTINGуказана опция.
  • DirectoryNotEmptyException: Попытка перемещения непустого каталога в другую файловую систему.

Рекомендуемый подход к обработке исключений:

Пример

try {
    Path source = Paths.get("C:/temp/source.txt");
    Path target = Paths.get("C:/temp2/target.txt");
    Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
    System.err.println("Ошибка перемещения файла: " + e.getMessage());
    e.printStackTrace();
}

Примечания

  1. Перемещение между файловыми системами: При перемещении файлов между разными файловыми системами это фактически операция копирования + удаления.
  2. Символические ссылки: По умолчанию выполняется переход по символическим ссылкам, если не указано иноеLinkOption.NOFOLLOW_LINKS
  3. Ограничения перемещения каталогов: Нельзя переместить каталог в себя или в его подкаталог.
  4. Атрибуты файла: Операции перемещения обычно сохраняют основные атрибуты файла.
  5. Соображения производительности: Перемещение в пределах одной файловой системы обычно намного быстрее, чем перемещение между файловыми системами.

Примеры практического применения

Безопасное перемещение файлов

Пример

public static boolean safeMoveFile(Path source, Path target) {
    try {
        // Попробовать атомарное перемещение
        Files.move(source, target, StandardCopyOption.ATOMIC_MOVE);
        return true;
    } catch (AtomicMoveNotSupportedException e) {
        try {
            // Если атомарное перемещение не поддерживается, используйте обычное перемещение + перезапись
            Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
            return true;
        } catch (IOException ex) {
            System.err.println("Не удалось переместить файл: " + ex.getMessage());
            return false;
        }
    } catch (IOException e) {
        System.err.println("Не удалось переместить файл: " + e.getMessage());
        return false;
    }
}

Пакетное перемещение файлов

Пример

public static void batchMoveFiles(Path sourceDir, Path targetDir, String filePattern)
    throws IOException {
   
    try (DirectoryStream<Path> stream = Files.newDirectoryStream(sourceDir, filePattern)) {
        for (Path sourceFile : stream) {
            Path targetFile = targetDir.resolve(sourceFile.getFileName());
            Files.move(sourceFile, targetFile);
        }
    }
}

Java File Java java.nio.file.Files

Другие расширения