Метод move() класса java.nio.file.Files в Java
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);
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 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);
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 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);
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();
}
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();
}
Примечания
- Перемещение между файловыми системами: При перемещении файлов между разными файловыми системами это фактически операция копирования + удаления.
- Символические ссылки: По умолчанию выполняется переход по символическим ссылкам, если не указано иное
LinkOption.NOFOLLOW_LINKS - Ограничения перемещения каталогов: Нельзя переместить каталог в себя или в его подкаталог.
- Атрибуты файла: Операции перемещения обычно сохраняют основные атрибуты файла.
- Соображения производительности: Перемещение в пределах одной файловой системы обычно намного быстрее, чем перемещение между файловыми системами.
Примеры практического применения
Безопасное перемещение файлов
Пример
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;
}
}
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);
}
}
}
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 java.nio.file.Files