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

Можно ли переименовать файл, скажем, test.txt в test1.txt?

Если test1.txt существует, будет ли он переименован?

Как мне переименовать его в уже существующий файл test1.txt, чтобы в него было добавлено новое содержимое test.txt для дальнейшего использования?


person Community    schedule 21.07.2009    source источник
comment
Ваш последний абзац вообще не описывает операцию переименования. Он описывает операцию добавления.   -  person user207421    schedule 11.09.2015


Ответы (14)


Скопировано с http://exampledepot.8waytrips.com/egs/java.io/RenameFile.html

// File (or directory) with old name
File file = new File("oldname");

// File (or directory) with new name
File file2 = new File("newname");

if (file2.exists())
   throw new java.io.IOException("file exists");

// Rename file (or directory)
boolean success = file.renameTo(file2);

if (!success) {
   // File was not successfully renamed
}

Чтобы добавить в новый файл:

java.io.FileWriter out= new java.io.FileWriter(file2, true /*append=yes*/);
person Pierre    schedule 21.07.2009
comment
Этот код не будет работать во всех случаях и на всех платформах. Метод переименования в метод ненадежен: http://stackoverflow.com/questions/1000183/reliable-file-renameto-alternative-on-windows - person Stephane Grenier; 21.10.2009
comment
У меня работает только способ Path, renameTo всегда возвращает false. Проверьте либо ответ kr37, либо этот ответ - person andras; 09.06.2019

Суммируя:

Files.move(source, source.resolveSibling("newname"));

Подробнее:

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

Следующее скопировано непосредственно из http://docs.oracle.com/javase/7/docs/api/index.html:

Предположим, мы хотим переименовать файл в newname, сохранив файл в том же каталоге:

Path source = Paths.get("path/here");
Files.move(source, source.resolveSibling("newname"));

В качестве альтернативы предположим, что мы хотим переместить файл в новый каталог, сохранив то же имя файла и заменив любой существующий файл с этим именем в каталоге:

Path source = Paths.get("from/path");
Path newdir = Paths.get("to/path");
Files.move(source, newdir.resolve(source.getFileName()), StandardCopyOption.REPLACE_EXISTING);
person kr37    schedule 28.11.2013
comment
Путь - это интерфейс, единственными реализациями которого являются WindowsPath, ZipPath и AbstractPath. Будет ли это проблемой для мультиплатформенных реализаций? - person Caelum; 01.12.2015
comment
Привет, @ user2104648, здесь (tutorials.jenkov.com/java-nio/path.html) - это пример того, как вы могли бы обрабатывать файлы в среде Linux. По сути, вам нужно использовать java.nio.file.Paths.get (somePath) вместо одной из упомянутых вами реализаций. - person maxivis; 09.12.2015
comment
Что такое Path source = ...? - person Koray Tugay; 05.01.2016
comment
@ kr37 безупречный ответ! - person Gaurav; 26.07.2019
comment
@KorayTugay. Path source = file.getAbsolutePath(); Где file - это файл, который нужно переименовать. - person yurin; 16.04.2021

Вы хотите использовать renameTo в файле объект.

Сначала создайте объект File для представления места назначения. Проверьте, существует ли этот файл. Если он не существует, создайте новый объект File для перемещаемого файла. вызовите метод renameTo для файла, который нужно переместить, и проверьте возвращаемое значение из renameTo, чтобы узнать, был ли вызов успешным.

Если вы хотите добавить содержимое одного файла в другой, существует несколько доступных средств записи. Судя по расширению, это похоже на обычный текст, поэтому я бы посмотрел на FileWriter.

person Thomas Owens    schedule 21.07.2009
comment
Понятия не имею, но это то же самое, что опубликовал Пьер, без исходного кода ... - person Thomas Owens; 21.07.2009

Для Java 1.6 и ниже я считаю, что самым безопасным и чистым API является Files.move.

Пример:

File newFile = new File(oldFile.getParent(), "new-file-name.txt");
Files.move(oldFile.toPath(), newFile.toPath());

Первая строка проверяет, находится ли новый файл в том же каталоге, то есть в родительском каталоге старого файла.

РЕДАКТИРОВАТЬ: Я написал это до того, как начал использовать Java 7, которая представила очень похожий подход. Итак, если вы используете Java 7+, вы должны увидеть ответ kr37 и проголосовать за него.

person Zoltán    schedule 26.07.2013

Переименование файла путем переименования его в новое имя. (FileUtils из библиотеки Apache Commons IO)

  String newFilePath = oldFile.getAbsolutePath().replace(oldFile.getName(), "") + newName;
  File newFile = new File(newFilePath);

  try {
    FileUtils.moveFile(oldFile, newFile);
  } catch (IOException e) {
    e.printStackTrace();
  }
person Brandon    schedule 17.03.2013

Это простой способ переименовать файл:

        File oldfile =new File("test.txt");
        File newfile =new File("test1.txt");

        if(oldfile.renameTo(newfile)){
            System.out.println("File renamed");
        }else{
            System.out.println("Sorry! the file can't be renamed");
        }
person senior    schedule 04.03.2015

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import static java.nio.file.StandardCopyOption.*;

Path yourFile = Paths.get("path_to_your_file\text.txt");

Files.move(yourFile, yourFile.resolveSibling("text1.txt"));

Чтобы заменить существующий файл с именем «text1.txt»:

Files.move(yourFile, yourFile.resolveSibling("text1.txt"),REPLACE_EXISTING);
person Kirill Ch    schedule 24.03.2017

Попробуй это

File file=new File("Your File");
boolean renameResult = file.renameTo(new File("New Name"));
// todo: check renameResult

Примечание. Мы всегда должны проверять возвращаемое значение renameTo, чтобы убедиться, что переименование файла выполнено успешно, поскольку он зависит от платформы (другая операционная система, другая файловая система) и не генерирует исключение ввода-вывода в случае сбоя переименования.

person anoopknr    schedule 25.03.2018
comment
Чем это отличается от принятого ответа Пьера девятью годами ранее? - person Forage; 19.02.2020

Да, вы можете использовать File.renameTo (). Но не забудьте указать правильный путь при переименовании его в новый файл.

import java.util.Arrays;
import java.util.List;

public class FileRenameUtility {
public static void main(String[] a) {
    System.out.println("FileRenameUtility");
    FileRenameUtility renameUtility = new FileRenameUtility();
    renameUtility.fileRename("c:/Temp");
}

private void fileRename(String folder){
    File file = new File(folder);
    System.out.println("Reading this "+file.toString());
    if(file.isDirectory()){
        File[] files = file.listFiles();
        List<File> filelist = Arrays.asList(files);
        filelist.forEach(f->{
           if(!f.isDirectory() && f.getName().startsWith("Old")){
               System.out.println(f.getAbsolutePath());
               String newName = f.getAbsolutePath().replace("Old","New");
               boolean isRenamed = f.renameTo(new File(newName));
               if(isRenamed)
                   System.out.println(String.format("Renamed this file %s to  %s",f.getName(),newName));
               else
                   System.out.println(String.format("%s file is not renamed to %s",f.getName(),newName));
           }
        });

    }
}

}

person V1ma-8    schedule 26.12.2018

Если он просто переименовывает файл, вы можете использовать File.renameTo ().

Если вы хотите добавить содержимое второго файла к первому, взгляните на FileOutputStream с опцией конструктора добавления или То же самое для FileWriter. Вам нужно будет прочитать содержимое файла, чтобы добавить и записать его, используя выходной поток / писатель.

person Dan Vinton    schedule 21.07.2009

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

О переименовании файла в Java см. документация для renameTo() метода в классе File.

person Yuval    schedule 21.07.2009

Files.move(file.toPath(), fileNew.toPath()); 

работает, но только когда вы закрываете (или автоматически закрываете) ВСЕ используемые ресурсы (InputStream, FileOutputStream и т.д.) Я думаю такая же ситуация с file.renameTo или FileUtils.moveFile.

person Zhurov Konstantin    schedule 30.03.2017

Вот мой код для успешного переименования нескольких файлов в папке:

public static void renameAllFilesInFolder(String folderPath, String newName, String extension) {
    if(newName == null || newName.equals("")) {
        System.out.println("New name cannot be null or empty");
        return;
    }
    if(extension == null || extension.equals("")) {
        System.out.println("Extension cannot be null or empty");
        return;
    }

    File dir = new File(folderPath);

    int i = 1;
    if (dir.isDirectory()) { // make sure it's a directory
        for (final File f : dir.listFiles()) {
            try {
                File newfile = new File(folderPath + "\\" + newName + "_" + i + "." + extension);

                if(f.renameTo(newfile)){
                    System.out.println("Rename succesful: " + newName + "_" + i + "." + extension);
                } else {
                    System.out.println("Rename failed");
                }
                i++;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

и запустим его для примера:

renameAllFilesInFolder("E:\\Downloads\\Foldername", "my_avatar", "gif");
person Tạ Anh Tú    schedule 11.09.2018

Работающий код здесь.

private static void renameFile(File fileName) {

    FileOutputStream fileOutputStream =null;

    BufferedReader br = null;
    FileReader fr = null;

    String newFileName = "yourNewFileName"

    try {
        fileOutputStream = new FileOutputStream(newFileName);

        fr = new FileReader(fileName);
        br = new BufferedReader(fr);

        String sCurrentLine;

        while ((sCurrentLine = br.readLine()) != null) {
            fileOutputStream.write(("\n"+sCurrentLine).getBytes());
        }

        fileOutputStream.flush();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            fileOutputStream.close();
            if (br != null)
                br.close();

            if (fr != null)
                fr.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}
person Dinesh Kumar    schedule 23.09.2017
comment
Обычно лучше объяснить решение, чем просто публиковать несколько строк анонимного кода. Вы можете прочитать Как написать хороший ответ, а также Объяснение полностью основанных на коде ответов - person Anh Pham; 23.09.2017
comment
Копирование и переименование - обычно разные операции, поэтому я думаю, что следует четко указать, что это копия. Что также оказывается ненужным медленным, поскольку копирует символы, а не байты. - person Joel Klinghed; 03.10.2017