Автор оригинала: Eugen Paraschiv.
1. Обзор
В этом кратком руководстве мы рассмотрим переименование/перемещение файла в Java.
Сначала мы рассмотрим использование классов Files и Path , затем класса Java File , Google Guava и, наконец, библиотеки ввода-вывода Apache Commons.
Эта статья является частью серии “Java – Back to Basic” здесь, на Baeldung.
Дальнейшее чтение:
Как скопировать файл с помощью Java
Введение в API файлов Java NIO2
Размер файла в Java
2. Настройка
В примерах мы будем использовать следующую настройку, которая состоит из 2 констант для исходного и целевого имени файла и шага очистки, чтобы иметь возможность запускать тесты несколько раз:
private final String FILE_TO_MOVE = "src/test/resources/originalFileToMove.txt"; private final String TARGET_FILE = "src/test/resources/targetFileToMove.txt"; @BeforeEach public void createFileToMove() throws IOException { File fileToMove = new File(FILE_TO_MOVE); fileToMove.createNewFile(); } @AfterEach public void cleanUpFiles() { File targetFile = new File(TARGET_FILE); targetFile.delete(); }
3. Использование классов путей и файлов NIO
Давайте начнем с , используя Files.move() метод из пакета Java NIO:
@Test public void givenUsingNio_whenMovingFile_thenCorrect() throws IOException { Path fileToMovePath = Paths.get(FILE_TO_MOVE); Path targetPath = Paths.get(TARGET_FILE); Files.move(fileToMovePath, targetPath); }
В JDK 7 пакет NIO был значительно обновлен, и добавлен класс Path . Это обеспечивает методы для удобного манипулирования артефактами файловой системы.
Обратите внимание, что и файл, и целевой каталог должны существовать.
4. Использование класса File
Давайте теперь посмотрим, как мы можем сделать то же самое с помощью метода File.renameTo() :
@Test public void givenUsingFileClass_whenMovingFile_thenCorrect() throws IOException { File fileToMove = new File(FILE_TO_MOVE); boolean isMoved = fileToMove.renameTo(new File(TARGET_FILE)); if (!isMoved) { throw new FileSystemException(TARGET_FILE); } }
В этом примере файл, подлежащий перемещению, существует, как и целевой каталог.
Обратите внимание, что renameTo() выдает только два типа исключений:
- SecurityException – если менеджер безопасности запрещает доступ для записи к источнику или к месту назначения
- NullPointerException – в случае, если целевой параметр равен null
Если целевой объект не существует в файловой системе – исключение не будет выдано – и вам придется проверить возвращенный флаг успеха метода.
5. Использование гуавы
Далее – давайте взглянем на решение Guava, которое предоставляет удобный метод Files.move() :
@Test public void givenUsingGuava_whenMovingFile_thenCorrect() throws IOException { File fileToMove = new File(FILE_TO_MOVE); File targetFile = new File(TARGET_FILE); com.google.common.io.Files.move(fileToMove, targetFile); }
Опять же, в этом примере файл, который нужно переместить, и целевой каталог должны существовать.
6. С помощью Commons IO
Наконец, давайте рассмотрим решение с помощью Apache Commons IO – вероятно, самое простое:
@Test public void givenUsingApache_whenMovingFile_thenCorrect() throws IOException { FileUtils.moveFile(FileUtils.getFile(FILE_TO_MOVE), FileUtils.getFile(TARGET_FILE)); }
Эта одна строка, конечно, позволит как перемещать, так и переименовывать, в зависимости от того, совпадает ли целевой каталог или нет.
В качестве альтернативы – вот решение для перемещения, которое также позволяет нам автоматически создавать каталог назначения, если он еще не существует:
@Test public void givenUsingApache_whenMovingFileApproach2_thenCorrect() throws IOException { FileUtils.moveFileToDirectory( FileUtils.getFile("src/test/resources/fileToMove.txt"), FileUtils.getFile("src/main/resources/"), true); }
6. Заключение
В этой статье мы рассмотрели различные решения для перемещения файла в Java. Мы сосредоточились на переименовании в этих фрагментах кода, но перемещение, конечно, то же самое, только целевой каталог должен быть другим.
Код для примеров доступен на GitHub .