Перейменуйте файл за допомогою Java


174

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

Якщо test1.txtіснує, чи буде вона перейменована?

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


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, або цю відповідь
andras

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 :

Припустимо, ми хочемо перейменувати файл на "нове ім'я", зберігаючи файл у тому самому каталозі:

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);

1
Шлях - це інтерфейс, єдиними реалізаціями якого є WindowsPath, ZipPath та AbstractPath. Чи це буде проблемою для багатоплатформних реалізацій?
Caelum

1
Привіт @ user2104648, ось ( tutorials.jenkov.com/java-nio/path.html ) є прикладом про те, як можна обробляти файли в середовищі Linux. В основному вам потрібно використовувати java.nio.file.Paths.get (somePath) замість того, щоб використовувати одну з реалізацій, про яку ви згадали
maxivis

2
Що таке джерело Шляху = ...?
Корай Тугай

@ kr37 бездоганна відповідь!
gaurav

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());

Перший рядок гарантує, що розташування нового файлу є тим самим каталогом, тобто батьківським каталогом старого файлу.

EDIT: Я писав це ще до того, як почав використовувати Java 7, який запровадив дуже схожий підхід. Отже, якщо ви використовуєте Java 7+, вам слід побачити і підтвердити відповідь kr37.


18

Перейменування файла шляхом переміщення його до нового імені. (FileUtils - від IO lib Apache Commons)

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

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

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, щоб переконатися, що файл перейменування є успішним, оскільки він залежить від платформи (інша Операційна система, інша файлова система) і не викидає IO виключення, якщо перейменування не вдалося.


Чим це відрізняється від прийнятої відповіді, даної П’єром 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));
           }
        });

    }
}

}


3

Якщо це лише перейменування файлу, ви можете використовувати File.renameTo () .

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


2

Наскільки мені відомо, перейменування файлу не додасть його вмісту до наявного файлу з цільовим ім'ям.

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


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

працює, але тільки тоді , коли ви близько (або AUTOCLOSE) всі використовувані ресурси ( 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

Копіювання та перейменування зазвичай є різними операціями, тому я думаю, що слід чітко позначити, що це копія. Що також буває непотрібним повільним, оскільки воно копіює символи, а не байти.
Джоель Клингхед
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.