«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.