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 .