Перейти к основному содержимому

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

· 3 мин. чтения

1. Обзор

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

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

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

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.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 — в случае, если цель параметра равна нулю

Если цель не существует в файловой системе — исключение не будет выдано — и вам придется проверить возвращенный флаг успеха метода.

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

Наконец, давайте взглянем на решение с 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 .