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

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

1. обзор

В этом кратком руководстве мы рассмотримrenaming / moving a File in Java - сначала с использованием JDK 6, затем JDK 7 с NIO, Google Guava и, наконец, библиотеки Apache Commons IO.

Эта статья является частьюthe “Java – Back to Basic” series здесь для примера.

Дальнейшее чтение:

Как скопировать файл с Java

Взгляните на некоторые распространенные способы копирования файлов в Java.

Read more

Введение в файловый API Java NIO2

Краткое и практическое руководство по Java NIO2 File API

Read more

Размер файла в Java

Примеры того, как получить размер файла в Java.

Read more

2. С JDK 6

Начнем с простого решения Java, JDK6:

@Test
public void givenUsingJDK6_whenMovingFile_thenCorrect() throws IOException {
    File fileToMove = new File("src/test/resources/toMoveFile_jdk6.txt");
    boolean isMoved = fileToMove.renameTo(new File("src/test/resources/movedFile_jdk6.txt"));
    if (!isMoved) {
        throw new FileSystemException("src/test/resources/movedFile_jdk6.txt");
    }
}

В этом примере - файл для перемещения существует, как и целевой каталог.

Обратите внимание, чтоrenameTo() выдает только два типа исключений -SecurityException - если менеджер безопасности запрещает запись в доступе к источнику или к месту назначения, иNullPointerException - в случае, если параметр target равен null . Если цель не существует в файловой системе -no exception will be thrown - и вам нужно будет проверить возвращенный флаг успеха метода.

3. С JDK 7

Давайте теперь посмотрим, как мы можем сделать то же самое с помощью NIO и JDK 7:

@Test
public void givenUsingJDK7Nio2_whenMovingFile_thenCorrect() throws IOException {
    Path fileToMovePath =
      Files.createFile(Paths.get("src/test/resources/" + randomAlphabetic(5) + ".txt"));
    Path targetPath = Paths.get("src/main/resources/");

    Files.move(fileToMovePath, targetPath.resolve(fileToMovePath.getFileName()));
}

В JDK7 был значительно обновлен пакет NIO и добавленPath - это предоставляет методы для удобного управления артефактами файловой системы.

Обратите внимание, что, как и в предыдущем примере, должен существовать как файл, так и целевой каталог.

4. С гуавой

Далее - давайте посмотрим на решение Guava:

@Test
public void givenUsingGuava_whenMovingFile_thenCorrect()
  throws IOException {
    File fileToMove = new File("src/test/resources/fileToMove.txt");
    File destDir = new File("src/test/resources/");
    File targetFile = new File(destDir, fileToMove.getName());

    com.google.common.io.Files.move(fileToMove, targetFile);
}

Опять же, в этом примере файл, который нужно переместить, и целевой каталог должны существовать.

5. С Commons IO

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

@Test
public void givenUsingApache_whenMovingFile_thenCorrect() throws IOException {
    FileUtils.moveFile(
      FileUtils.getFile("src/test/resources/fileToMove.txt"),
      FileUtils.getFile("src/test/resources/fileMoved.txt"));
}

Эта одна строка, конечно, позволит как перемещать, так и переименовывать - в зависимости от того, является ли целевой каталог одинаковым или нет.

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

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

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

We looked at renaming in these code snippets, но перемещение, конечно же, одно и то же, только целевой каталог должен быть другим.

И вот, у вас это есть - 5 быстрых решений для перемещения файла в Java.