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 .
Java не удается переименовать файл
У меня есть массив байт, я создаю файл и записываю массив байт в этот файл, потом закрываю запись. Как запись закрыта я хочу переименовать расширение файла. Мой код:
FileOutputStream newFile = new FileOutputStream(rb_Path[0]+"\\"+file_id+".d"); //было .dat //Записать массив полученных байт в новый файл .dat newFile.write(byteNewFile); newFile.flush(); //Закрываем создание нового файла newFile.close(); File file_d = new File(rb_Path[0]+"\\"+file_id+".d"); //File file_dat = new File(rb_Path[0]+"\\"+file_id+".dat"); //file.d переименовать в file.dat boolean isRenamed = file_d.renameTo(new java.io.File(rb_Path[0] + "\\" + file_id + ".dat")); System.out.println(isRenamed);
Но получаю false. И как итог не переименовался файл (1234.d на 1234.dat). Также пробовал так:
File file_d = new File(rb_Path[0]+"\\"+file_id+".d"); //Создан File file_dat = new File(rb_Path[0]+"\\"+file_id+".dat"); //Не создан, служит объектом для rename //file.d переименовать в file.dat boolean isRenamed = file_d.renameTo(file_dat); System.out.println(isRenamed);
- rb_Path[0] — не имеет некорректных символов.
- file_id — это int, например 1234
Поэтому даже не знаю как быть.
Подскажите пожалуйста как можно решить такую задачу. Может стоит и вовсе делать все по другому? У кого есть решение? Заранее спасибо большое.
Java пример — переименование файлов
Следующий пример демонстрирует использование класса File oldName.renameTo (NEWNAME) метод, чтобы переименовать файл:
/* author by w3cschool.cc Main.java */ import java.io.File; public class Main < public static void main(String[] args) < File oldName = new File("C:/program.txt"); File newName = new File("C:/java.txt"); if(oldName.renameTo(newName)) < System.out.println("已重命名"); >else < System.out.println("Error"); >> >
Выход выше кода для запуска (выполнения вы можете создать файл перед program.txt программы):
Как переименовать файл в Java
Java поставляется с методом renameTo () для переименования файла. Однако этот метод действительно зависит от платформы: вы можете успешно переименовать файл в * nix, но в Windows это не удалось. Таким образом, возвращаемое значение (true, если переименование файла прошло успешно, false, если не удалось), всегда нужно проверять, чтобы убедиться, что файл переименован успешно.
File.renameTo () Пример
package com.csharpcoderr.file; import java.io.File; public class RenameFileExample < public static void main(String[] args) < File oldfile =new File("oldfile.txt"); File newfile =new File("newfile.txt"); if(oldfile.renameTo(newfile))< System.out.println("Rename succesful"); >else < System.out.println("Rename failed"); >> >