«1. Обзор

В этом кратком руководстве мы рассмотрим переименование/перемещение файла в Java.

Сначала мы рассмотрим использование классов Files и Path из NIO, затем класса Java File, Google Guava и, наконец, библиотеки Apache Commons IO.

Эта статья является частью серии «Java — Back to Basic» здесь, на Baeldung.

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);
}

В JDK7 пакет 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 — в случае, если параметр target равен null ~~ ~ Если цель не существует в файловой системе, исключение не будет выдано, и вам придется проверить возвращенный флаг успеха метода.

5. Использование Guava

Далее — давайте взглянем на решение 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

Наконец, давайте рассмотрим решение с вводом-выводом Apache Commons — возможно, самое простое: переименование, в зависимости от того, совпадает ли целевой каталог или нет.

В качестве альтернативы — вот решение для конкретного перемещения, которое также позволяет нам автоматически создавать каталог назначения, если он еще не существует:

@Test
public void givenUsingApache_whenMovingFile_thenCorrect() throws IOException {
    FileUtils.moveFile(FileUtils.getFile(FILE_TO_MOVE), FileUtils.getFile(TARGET_FILE));
}

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

В этой статье мы рассмотрели различные решения для перемещения файла в Java. В этих фрагментах кода мы сосредоточились на переименовании, но перемещение — это, конечно, то же самое, только целевой каталог должен быть другим.

@Test
public void givenUsingApache_whenMovingFileApproach2_thenCorrect() throws IOException {
    FileUtils.moveFileToDirectory(
      FileUtils.getFile("src/test/resources/fileToMove.txt"), 
      FileUtils.getFile("src/main/resources/"), true);
}

Код примеров доступен на GitHub.

«

The code for the examples is available over on GitHub.