Рубрики
Без рубрики

Java – Переименование или перемещение файла

Как переименовать или переместить файл на Java, используя JDK6, JDK7, Guava или Apache Commons.

Автор оригинала: 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 .