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

174

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

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

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

JonasCz - Восстановить Монику
источник
6
Ваш последний абзац вообще не описывает операцию переименования. Описывает операцию добавления.
Маркиз Лорн

Ответы:

173

Скопировано с 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*/);
пьер
источник
24
Этот код не будет работать во всех случаях и на разных платформах. Переименование метода ненадежно: stackoverflow.com/questions/1000183/…
Стефан Гренье
Только Pathспособ работает для меня, renameToвсегда возвращает ложь. Проверьте либо ответ на kr37 или этот ответ
Андраш
107

Коротко:

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

Более детально:

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

Следующее скопировано непосредственно с 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()), REPLACE_EXISTING);
kr37
источник
1
Path - это интерфейс, единственными реализациями которого являются WindowsPath, ZipPath и AbstractPath. Будет ли это проблемой для мультиплатформенных реализаций?
Caelum
1
Здравствуйте, @ user2104648, здесь ( tutorials.jenkov.com/java-nio/path.html ) приведен пример того, как вы можете обрабатывать файлы в среде Linux. По сути, вам нужно использовать java.nio.file.Paths.get (somePath) вместо одной из упомянутых вами реализаций
maxivis
2
Что такое путь источника = ...?
Корай Тугай
@ kr37 безупречный ответ!
Гаурав
30

Вы хотите использовать метод renameTo для объекта File .

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

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

Томас Оуэнс
источник
9
Понятия не имею, но это то же самое, что написал Пьер без исходного кода ...
Томас Оуэнс
28

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

Пример:

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

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

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

Золтан
источник
18

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

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

  try {
    FileUtils.moveFile(oldFile, newFile);
  } catch (IOException e) {
    e.printStackTrace();
  }
Brandon
источник
13

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

        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");
        }
старшая
источник
5
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);
Кирилл Ч
источник
5

Попробуй это

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

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

anoopknr
источник
Чем это отличается от принятого ответа, данного Пьером 9 лет назад?
корм
4

Да, вы можете использовать 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));
           }
        });

    }
}

}

V1ma-8
источник
3

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

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

Дэн Винтон
источник
2

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

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

Юваль
источник
1
Files.move(file.toPath(), fileNew.toPath()); 

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

Журов Константин
источник
1

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

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");
Ту Ань Ту
источник
-2

Запуск кода здесь.

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();
        }
    }
}
Динеш Кумар
источник
2
Обычно лучше объяснить решение, чем просто разместить несколько строк анонимного кода. Вы можете прочитать Как мне написать хороший ответ , а также Объяснить полностью основанные на коде ответы
Anh Pham
Копирование и переименование, как правило, разные операции, поэтому я думаю, что это должно быть четко отмечено, что это копия. Который также оказывается ненужным медленным, поскольку он копирует символы, а не байты.
Джоэл Клингхед