Переименовать или переместить файл или каталог в Java

Научитесь переименовывать файл или каталог по указанному пути или перемещаться в новый каталог в Java. Мы научимся использовать классы из Standard IO, New IO, Guava и Commons IO.

1. Использование File.renameTo()

Как следует из названия метода, renameTo() переименовывает файл, присваивая ему новое имя, или перемещает файл в новый каталог.

  • Функция renameTo() возвращает значение true или false, указывающее, успешно ли было переименование.
  • Он выдает исключение SecurityException, если возникают проблемы с доступом на запись в старый или новый файл.
File originalFile = new File("c:/temp/demo.txt");File renamedFile = new File("c:/temp/demoNew.txt");File movedFile = new File("c:/temp/moved/demoNew.txt");boolean isCopied = originalFile.renameTo(renamedFile);boolean isMoved = renamedFile.renameTo(movedFile);System.out.println(isCopied); //trueSystem.out.println(isMoved); //true

2. Новые IO Files.move()

Files.move() похож на renameTo(), за исключением того, что он работает с экземплярами Path вместо экземпляров File.

  • Метод move() перемещает или переименовывает файл в целевой файл. Перемещение файла скопирует last-modified-time в целевой файл, если поддерживается
  • Если заданный файл и целевой файл одинаковы, то этот метод не имеет эффекта.
  • Если целевой файл уже существует, то move() не сработает. В таких случаях мы можем использовать StandardCopyOption.REPLACE_EXISTING.
  • Чтобы выполнить всю операцию переименования или перемещения как одну атомарную операцию, мы можем использовать опцию StandardCopyOption.ATOMIC_MOVE. Если перемещение не может быть выполнено как атомарная операция файловой системы(в случае двух разных файловых систем), то выбрасывается исключение AtomicMoveNotSupportedException.
  • Если файл является символической ссылкой, то перемещается сама символическая ссылка, а не цель ссылки.
  • Переименование каталога может завершиться неудачей, если требуется переместить файлы в новое место, т.е. каталог перемещается в место. Если это простое переименование каталога в том же месте в файловой системе, оно будет успешным.
Path file = Path.of("c:/temp/demo.txt");//Rename in same directoryFiles.move(file, file.resolveSibling("demoNew.txt"));//Move to new directoryPath newDir = Path.of("c:/temp/moved/");Files.move(file, newDir.resolve(file.getFileName()),StandardCopyOption.ATOMIC_MOVE,StandardCopyOption.REPLACE_EXISTING);

3. Файлы Гуавы.move()

Этот метод Files.move() перемещает файл из одного пути в другой. Это применимо к переименованию и перемещению, обе операции.

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

File originalFile = new File("c:/temp/demo.txt");File renamedFile = new File("c:/temp/demoNew.txt");com.google.common.io.Files.move(originalFile, renamedFile);com.google.common.io.Files.move(renamedFile, movedFile);

4. Общие IO FileUtils

Класс FileUtils предоставляет множество методов для перемещения или переименования файлов и каталогов в соответствии с требованиями.

  • moveDirectory(File srcDir, File destDir) – перемещает каталог в место назначения и удаляет исходный каталог.
  • moveDirectoryToDirectory(File src, File destDir, boolean createDestDir) : перемещает каталог в другой каталог и принимает опцию создания нового каталога или нет. Если createDestDir имеет значение false и новый каталог не может быть создан, то будет выдано исключение IOException.
  • moveFile(File srcFile, File destFile, CopyOption… copyOptions) : перемещает файл, сохраняя атрибуты файла с дополнительными параметрами копирования.
  • moveFileToDirectory(File srcFile, File destDir, boolean createDestDir) : перемещает файл в указанный каталог.
  • moveToDirectory(File src, File destDir, boolean createDestDir) : перемещает файл или каталог в целевой каталог.
FileUtils.moveFile(originalFile, renamedFile);File targetDirectory = new File("c:/temp/moved/");FileUtils.moveFileToDirectory(originalFile, targetDirectory, true);

5. Заключение

В этом коротком уроке мы научились переименовывать файл или каталог или перемещать его в новое место с помощью различных параметров копирования.

Хотя стандартные IO и новые классы IO предоставляют все виды возможностей, класс FileUtils Common IO предоставляет очень специфические методы для каждого вида операции. Эти специфические имена методов очень хорошо передают намерение.

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

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