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